
/**
 * @file RST_WebSDK底层封装，直接调用插件的方法
 * 1、谷歌浏览器：chrome45（包括45）以上版本都不行，chrome42（包括42）以上版本可以，但是只支持32位的且需要手动启动npapi插件，
 *    启用方法看https://jingyan.baidu.com/article/d621e8da2969662864913f4b.html，chrome42以下版本可以直接使用。
 * 2、火狐浏览器：Firefox 52（包括）以上版本都不行，以下版本都可以，但是像51版本只支持32位的，版本越低，32位和64位都会支持，跟谷歌浏览器类似。
 * 3、IE：IE11及以下的版本，Edge不支持
 */

/**
 *******************************************************************************************************************
 ***************************************************修改记录*********************************************************
 *******************************************************************************************************************
 */

/**
 * 修改记录
 * 20190903:
 *  1、新增方法NPCCIF.RSTW_EVT_CallUserTalkRequest(); // 呼叫用户语音通话的请求，响应会通过事件方式通知给上层
 */

/**
 * 修改记录
 * 20190822:
 *  1、新增方法NPCCIF.RSTW_Chat_Login(); // 登录即时会话服务
 *  2、新增方法NPCCIF.RSTW_Chat_IsLogin(); // 即时会话服务是否登录
 *  3、新增方法NPCCIF.RSTW_Chat_Logout(); // 退出即时会话服务
 *  4、新增方法NPCCIF.RSTW_Chat_SendShortMsg(); // 发送短消息，非阻塞接口，发送通知告知上层是否发送成功
 */

/**
 * 修改记录
 * 20190820:
 *  1、新增方法NPCCIF.RSTW_OSS_ManualStartStorage(); // 手动开启平台录像
 *  2、新增方法NPCCIF.RSTW_OSS_ManualStopStorage(); // 手动关闭平台录像
 */

/**
 * 修改记录
 * 20190819:
 *  1、新增方法NPCCIF.RSTW_IsSupportedRealtimePlayback(); // 是否支持实时回放
 */

/**
 * 修改记录
 * 20190816:
 *  1、新增方法NPCCIF.RSTW_GetRealtimeTime(); // 获取当前音视频帧的utc时间
 *  2、新增方法NPCCIF.RSTW_GetRealPlaybackTime(); // 获取正在预览的音视频的utc时间
 */

/**
 * 修改记录
 * 20190814:
 *  1、新增方法NPCCIF.RSTW_GetRealtimeTimestamp(); // 获取当前音视频帧的时间戳
 *  2、新增方法NPCCIF.RSTW_GetRealPlaybackTimestamp(); // 获取正在预览的音视频的时间戳
 *  3、新增方法NPCCIF.RSTW_JumpPreview(); // 实时预览过程中，跳到之前位置回放
 */

/**
 * 修改记录
 * 20190814:
 *  1、新增方法NPCCIF.RSTW_ForkResoure(); // 获取所有域、所有设备和资源
 *  2、新增方法NPCCIF.RSTW_GetLoginStatus(); // 获取登录服务器状态
 *  3、新增方法NPCCIF.RSTW_Logout(); // 退出平台
 */

/**
 * 修改记录
 * 20190325:
 *  1、新增方法NPCCIF.OSS_GetLocationDataDate(); // 查询定位信息的日期
 *  2、新增方法NPCCIF.OSS_GetLocationDateData(); // 查询指定日期的定位信息
 */

/**
 * 修改记录
 * 20190322：
 *  1、新增方法NPCCIF.DEV_GetBatteryParam(); // 查询电量
 *  1、新增方法NPCCIF.QueryEventLogEx(); // 查询历史报警事件
 */

/**
 * 修改记录
 * 20181113
 * 1、新增方法NPCCIF.RSTW_LoginNoBlock(); // 非阻塞的登录平台接口
 * 2、新增方法NPCCIF.RSTW_LogoutNoBlock(); // 非阻塞的退出平台接口
 * 3、新增方法NPCCIF.RSTW_GetDomainList(); // 获取平台的所有域
 * 4、新增方法NPCCIF.RSTW_GetPUList(); // 获取平台下的设备列表
 * 5、新增方法NPCCIF.RSTW_GetOnePU(); //获取平台下的一个设备
 * 6、新增方法NPCCIF.RSTW_GetOrgList(); //获取组织列表
 * 7、新增方法NPCCIF.RSTW_ORG_GetNodeList(); //获取平台下的设备列表
 **/

/**
 * 修改记录
 * 20181102
 * 1、新增方法NPCCIF.RSTW_Util_ExecuteFile(); // 图片查看
 * 2、新增方法NPCCIF.RSTW_Rotate90(); // 旋转图像
 **/

/**
 * 修改记录
 * 20180926：
 *  1、新增方法NPCCIF.StartDownload(); // 启动下载
 *  2、新增方法NPCCIF.GetDownloadProgress(); // 获取下载进度
 *  3、新增方法NPCCIF.GetDownloadStatus(); // 获取下载状态
 *  4、新增方法NPCCIF.StopDownload(); // 停止下载
 */

/**
 * 修改记录
 * 20180911：
 *  1、新增方法NPCCIF.Util_DeleteFiles(); // 删除本地指定的存储文件
 *  2、新增方法NPCCIF.IsRecordOpen(); // 判断录像是否打开
 *  3、新增方法NPCCIF.OpenReplayPreview(); // 打开点播远程录像或者回放本地录像
 *  4、新增方法NPCCIF.SetPlayHasVideo(); // 设置是否带视频播放，默认为带视频播放
 *  5、新增方法NPCCIF.SetMedia(); // 设置预览状态
 *  6、新增方法NPCCIF.Replay(); // 设置点播或回放参数
 *  7、新增方法NPCCIF.StartReplayPreview(); // 开始点播或者回放本地录像
 *  8、新增方法NPCCIF.PauseReplayPreview(); // 暂停点播或者回放本地录像
 *  9、新增方法NPCCIF.JumpReplayPreview(); // 跳到指定位置继续播放
 *  10、新增方法NPCCIF.StopReplayPreview(); // 停止点播或者回放本地录像
 *  11、新增方法NPCCIF.CloseReplayPreview(); // 关闭点播或者回放本地录像
 *  12、新增方法NPCCIF.GetVideoRenderStatus(); // 视频的点播或回放状态
 *  13、新增方法NPCCIF.GetInputAudioRenderStatus(); // 输入音频的点播或回放状态
 *  14、新增方法NPCCIF.GetOutputAudioRenderStatus(); // 输出音频的点播或回放状态
 *  15、新增方法NPCCIF.GetVodTotalTime(); // 获取点播总时间，即点播或回放当前录像文件需要的总时间
 *  16、新增方法NPCCIF.GetVodCurTime(); // 获取当前点播的时间，即点播或回放当前录像文件的当前时间
 *  17、新增方法NPCCIF.SetRenderRect(); // 设置视频播放窗口区域
 *  18、新增方法NPCCIF.IsVideoPreviewOpen(); // 视频是否正在播放
 *  19、新增方法NPCCIF.IsInputAudioPreviewOpen(); // 输入音频是否正在播放
 *  20、新增方法NPCCIF.IsOutputAudioPreviewOpen(); // 输出视频是否正在播放
 */

/**
 * 修改记录
 * 20180820：
 *  1、新增方法NPCCIF.Util_IsFileExist(); // 指定文件是否存在
 *  2、新增方法NPCCIF.Util_IsDirExist(); //  指定目录是否存在
 *  3、新增方法NPCCIF.Util_CreateDir(); // 创建一个目录，递归创建各级目录
 *  4、新增方法NPCCIF.Util_PathNameToPath(); // 从全路径名中取出路径信息
 *  5、新增方法NPCCIF.Util_PathNameToName(); // 从全路径名中取出文件名信息
 *  6、新增方法NPCCIF.Util_GetFileSize(); // 获得文件的大小
 *  7、新增方法NPCCIF.Util_GetFiles(); // 获得一个目录下的文件列表
 *  8、新增方法NPCCIF.Util_GetSubDirs(); // 获得一个目录下的子目录列表
 */

/**
 * 修改记录
 * 20180814：
 *  1、新增方法NPCCIF.Snapshot(); // 本地抓拍图片
 *  2、新增方法NPCCIF.StartRecord(); // 启动本地录像
 *  3、新增方法NPCCIF.StopRecord(); // 停止本地录像
 */

/**
 * 修改记录
 * 20180809：
 *  1、新增方法NPCCIF.ORG_ForkNodeList(); // 获取当前组织下的子节点（不包括子节点的子节点）
 *  2、新增方法NPCCIF.ORG_GetNodeList(); // 获取当前组织下的子节点（不包括子节点的子节点）
 *  3、新增方法NPCCIF.ORG_ForkElement(); // 获取指定组织的所有资源
 *  4、新增方法NPCCIF.ORG_GetNodeID(); // 获取组织的节点ID
 *  5、新增方法NPCCIF.ORG_GetName(); // 获取组织名称
 *  6、新增方法NPCCIF.ORG_GetDesc(); // 获取组织描述
 *  7、新增方法NPCCIF.ORGNODE_GetResources(); // 获取组织节点下的资源
 *  8、新增方法NPCCIF.ORGNODE_GetSubNodes(); // 当前节点的子节点信息
 *  9、新增方法NPCCIF.ORGNODE_GetOrgID(); // 获取组织ID
 *  10、新增方法NPCCIF.ORGNODE_GetName(); // 获取节点名称
 *  11、新增方法NPCCIF.ORGNODE_GetDesc(); // 获取节点描述
 *  12、新增方法NPCCIF.GetOrgList(); // 获取组织列表
 */

/**
 * 修改记录
 * 20180808：
 *  1、新增方法NPCCIF.PTZ_GetPresetPositionList(); // 云台控制，获取预置位列表
 *  2、新增方法NPCCIF.PTZ_GetAuxiliaryDeviceList(); // 获取辅助设备列表
 *  3、新增方法NPCCIF.PTZ_StartTurnLeft(); // 向左转
 *  4、新增方法NPCCIF.PTZ_StartTurnRight(); // 向右转
 *  5、新增方法NPCCIF.PTZ_StartTurnUp(); // 向上转
 *  6、新增方法NPCCIF.PTZ_StartTurnDown(); // 向下转
 *  7、新增方法NPCCIF.PTZ_StopTurn(); // 停止转动
 *  8、新增方法NPCCIF.PTZ_AugmentAperture(); // 增大光圈
 *  9、新增方法NPCCIF.PTZ_MinishAperture(); // 减小光圈
 *  10、新增方法NPCCIF.PTZ_StopApertureZoom(); // 停止缩放光圈
 *  11、新增方法NPCCIF.PTZ_MakeFocusFar(); // 推远焦点
 *  12、新增方法NPCCIF.PTZ_MakeFocusNear(); // 拉近焦点
 *  13、新增方法NPCCIF.PTZ_StopFocusMove(); // 停止调整焦点
 *  14、新增方法NPCCIF.PTZ_ZoomOutPicture(); //  缩小图像
 *  15、新增方法NPCCIF.PTZ_ZoomInPicture(); //  放大图像
 *  16、新增方法NPCCIF.PTZ_StopPictureZoom(); // 停止缩放图像
 *  17、新增方法NPCCIF.PTZ_SetPresetPos(); // 设置预置位
 *  18、新增方法NPCCIF.PTZ_MoveToPresetPos(); // 前往预置位
 *  19、新增方法NPCCIF.PTZ_StartSecondaryDev(); // 开启辅助设备
 *  20、新增方法NPCCIF.PTZ_StartSecondaryDev(); // 关闭辅助设备
 */

/**
 * 修改记录
 * 20180807：
 *  1、新增方法NPCCIF.COMMON_GetNodeType(); // 获取资源节点类型
 *  2、新增方法NPCCIF.COMMON_GetParent(); // 获取父资源句柄
 *  3、新增方法NPCCIF.GetStorageUnitResList(); // 获取平台下的所有存储资源
 *  4、新增方法NPCCIF.OSS_GetStorageFileDate(); // 查询平台存储文件的日期
 *  5、新增方法NPCCIF.OSS_GetStorageDateFiles(); // 查询平台指定日期的存储文件
 *  6、新增方法NPCCIF.OSS_DeleteStorageDateFiles(); // 删除平台下的指定的存储文件
 *  7、新增方法NPCCIF.STOR_GetDiskInfo(); // 获取磁盘信息
 *  8、新增方法NPCCIF.STOR_GetFileSystemType(); // 获取存储文件系统类型
 *  9、新增方法NPCCIF.STOR_QueryStorageDateForStream(); // 流式存储系统：获取前端存储文件的日期
 *  10、新增方法NPCCIF.STOR_QueryStorageDataForStream(); // 流式存储系统：获取前端存储文件
 *  11、新增方法NPCCIF.STOR_QueryStorageDate(); // 文件存储系统：获取前端存储文件的日期
 *  12、新增方法NPCCIF.STOR_QueryStorageFile(); // 文件存储系统：获取前端存储文件
 *  13、新增方法NPCCIF.STOR_DeleteStorageDateFile(); // 删除前端指定的存储文件
 */

/**
 * 修改记录
 * 20180607：
 *  1、新增方法NPCCIF.GetUID(); // 获取当前登录用户ID
 *  2、新增方法NPCCIF.GetUserList(); // 获取所有子用户信息
 *  3、新增方法NPCCIF.AddUser(); // 添加新的用户
 *  4、新增方法NPCCIF.ModifyUser(); // 修改用户
 *  5、新增方法NPCCIF.DeleteUser(); // 删除用户
 *  6、新增方法NPCCIF.GetUserRes(); // 获取用户资源
 *  7、新增方法NPCCIF.AddUserRes(); // 添加用户资源
 *  8、新增方法NPCCIF.RemoveUserRes(); // 删除用户资源
 */

/**
 *******************************************************************************************************************
 *************************************************接口调用流程*******************************************************
 *******************************************************************************************************************
 */

/**
 * 阻塞与非阻塞登录接口
 * 1、调用阻塞登录接口NPCCIF.Open()，获取数据时先用ForkXXX接口将数据从服务器中取到本地，再次调用获取同样的数据时使用GetXXX接口即可
 * 2、调用非阻塞登录接口NPCCIF.RSTW_LoginNoBlock(),在登陆过程中已经把数据从服务器中取到本地，后期可直接使用GetXXX接口获取数据即可
 */

/**
 * 阻塞组织接口调用流程
 *1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *     NPCCIF.Open();
 * 3、获取子域
 *     NPCCIF.ForkDomainList();
 * 4、获取设备
 *     NPCCIF.ForkPUList();
 * 5、获取子资源
 *     NPCCIF.ForkResList();
 * 6、获取组织列表
 *     NPCCIF.ForkOrgList(); 返回的是组织句柄，可通过组织句柄获取需要的信息
 *          NPCCIF.COMMON_GetID();  获取组织ID
 *          NPCCIF.ORG_GetNodeID(); 获取组织的节点ID
 *          NPCCIF.ORG_GetName(); 获取组织名称
 *          NPCCIF.ORG_GetDesc(); 获取组织描述
 * 7、获取当前组织下的子节点（不包括子节点的子节点）
 *     NPCCIF.ORG_ForkNodeList();
 *          NPCCIF.COMMON_GetID();  获取节点ID
 *          NPCCIF.ORGNODE_GetOrgID(); // 获取当前节点所在组织ID
 *          NPCCIF.ORGNODE_GetName(); // 获取节点名称
 *          NPCCIF.ORGNODE_GetDesc(); // 获取节点描述
 * 8、获取组织下的所有资源
 *     NPCCIF.ORG_ForkElement()
 * 9、获取当前节点下的资源
 *     NPCCIF.ORGNODE_GetResources();
 * 10、获取当前节点的子节点信息
 *     NPCCIF.ORGNODE_GetSubNodes();
 * 11、退出平台
 *      NPCCIF.Close();
 * 12、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 非阻塞组织接口调用流程
 *1、初始化RST_WebSDK
 *     NPCCIF.Initialize();
 * 2、登录平台
 *     NPCCIF.RSTW_LoginNoBlock();
 * 3、获取子域
 *     NPCCIF.RSTW_GetDomainList();
 * 4、获取设备
 *     NPCCIF.RSTW_GetPUList();
 * 5、获取组织列表
 *     NPCCIF.GetOrgList(connectId); 返回的是组织句柄，可通过组织句柄获取需要的信息
 *          NPCCIF.COMMON_GetID();  获取组织ID
 *          NPCCIF.ORG_GetNodeID(); 获取组织的节点ID
 *          NPCCIF.ORG_GetName(); 获取组织名称
 *          NPCCIF.ORG_GetDesc(); 获取组织描述
 * 6、获取当前组织下的子节点（不包括子节点的子节点）
 *     NPCCIF.ORG_GetNodeList();
 *          NPCCIF.COMMON_GetID();  获取节点ID
 *          NPCCIF.ORGNODE_GetOrgID(); // 获取当前节点所在组织ID
 *          NPCCIF.ORGNODE_GetName(); // 获取节点名称
 *          NPCCIF.ORGNODE_GetDesc(); // 获取节点描述
 * 7、获取当前节点下的资源
 *     NPCCIF.ORGNODE_GetResources();
 * 8、获取当前节点的子节点信息
 *     NPCCIF.ORGNODE_GetSubNodes();
 * 9、退出平台
 *      NPCCIF.RSTW_LogoutNoBlock();
 * 10、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 阻塞RST_WebSDK底层方法调用主要流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、功能模块
 *  1）、启动音视频、喊话和对讲模块
 *  2）、定位功能模块
 *  3）、参数配置模块
 *  4）、云台控制模块
 *  5）、添加子用户并分配资源模块
 * 7、退出平台
 *      NPCCIF.Close();
 * 8、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 非阻塞RST_WebSDK底层方法调用主要流程
 *1、初始化RST_WebSDK
 *     NPCCIF.Initialize();
 * 2、登录平台
 *     NPCCIF.RSTW_LoginNoBlock();
 * 3、获取子域
 *     NPCCIF.RSTW_GetDomainList();
 * 4、获取设备
 *     NPCCIF.RSTW_GetPUList();
 * 5、功能模块
 *  1）、启动音视频、喊话和对讲模块
 *  2）、定位功能模块
 *  3）、参数配置模块
 *  4）、云台控制模块
 *  5）、添加子用户并分配资源模块
 * 6、退出平台
 *      NPCCIF.RSTW_LogoutNoBlock();
 * 7、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 获取域、设备和子资源流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize()
 * 2、登录平台
 *      NPCCIF.Open()
 * 3、根域名称
 *      NPCCIF.COMMON_GetName(ccPlugin, hServer);
 * 4、获取子域
 *      NPCCIF.ForkDomainList();
 *      NPCCIF.DOMAIN_GetID(ccPlugin, hDomain);
 *      NPCCIF.DOMAIN_GetDID(ccPlugin, hDomain);
 *      NPCCIF.DOMAIN_GetName(ccPlugin, hDomain);
 *      NPCCIF.DOMAIN_GetParentID(ccPlugin, hDomain);
 *      NPCCIF.DOMAIN_GetDesc(ccPlugin, hDomain);
 * 5、获取设备
 *      1)、NPCCIF.ForkPUList();
 *      2）、NPCCIF.COMMON_GetDID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetPUID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResType(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResIdx(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_IsEnable(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_IsOnline(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetName(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetDesc(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetModelType(ccPlugin, hPuRes);
 *          NPCCIF.DEV_GetModel(ccPlugin, hPuRes);
 *          NPCCIF.DEV_GetSoftwareVersion(ccPlugin, hPuRes);
 *          NPCCIF.DEV_GetHardwareVersion(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetLongitude(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetLatitude(ccPlugin, hPuRes);
 *          NPCCIF.DEV_GetDeviceSN(ccPlugin, hPuRes);
 * 6、获取子资源
 *      1）、NPCCIF.ForkResList();
 *      2）、NPCCIF.COMMON_GetChildren(ccPlugin, hPuRes);
 *      3）、NPCCIF.COMMON_GetDID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetPUID(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResType(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetResIdx(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_IsEnable(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_IsOnline(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetName(ccPlugin, hPuRes);
 *          NPCCIF.COMMON_GetDesc(ccPlugin, hPuRes);
 * 7、退出平台
 *      NPCCIF.Close();
 * 8、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 启动音视频、喊话和对讲模块的流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、创建窗口句柄、添加、删除窗口事件（本接口只支持左键单击事件）：参考NPCCInterlayer.js文件中NPCCILY.CreateWindow()方法和NPCCILY.WindowAttachEvent.Init()方法
 *      NPCCIF.GetWindowHandle();
 *      NPCCIF.AttachObjectEvent(pwPlugin, eventName, eventCallback);
 *      NPCCIF.DetachObjectEvent(ccPlugin, eventName, eventCallback);
 * 4、添加、删除CC插件事件回调：参考NPCCInterlayer.js文件中NPCCILY.CCNotifyManager.Add()方法
 *      需要注册的事件有：NPCCEnum.CCObjectNotify.event_notify、NPCCEnum.CCObjectNotify.stream_status_notify、NPCCEnum.CCObjectNotify.call_stream_status_notify
 *      NPCCIF.AttachObjectEvent(ccPlugin, eventName, eventCallback);
 *      NPCCIF.DetachObjectEvent(ccPlugin, eventName, eventCallback);
 * 5、获取子域
 *      NPCCIF.ForkDomainList();
 * 6、获取设备
 *      NPCCIF.ForkPUList();
 * 7、获取子资源
 *      NPCCIF.ForkResList();
 * 8、启动、停止视频
 *      NPCCIF.StartCameraPreview(ccPlugin, hCameraRes, hWnd, streamType, alg, width, height, frameRate, bitRate);
 *      NPCCIF.StopPreview(ccPlugin, hMedia, type);
 * 9、启动、停止音频
 *      NPCCIF.StartAudioPreview(ccPlugin, hMedia, hAudioRes);
 *      NPCCIF.StopPreview(ccPlugin, hMedia, type);
 * 10、启动、停止喊话：与对讲是互斥的即启动喊话，需要停止对讲
 *      NPCCIF.StartCallPreview(ccPlugin, hMedia, hTalkRes)
 *      NPCCIF.StopCallPreview(ccPlugin, hMedia, hTalkRes)
 * 11、启动、停止对讲：与喊话是互斥的即启动对讲，需要停止喊话
 *      NPCCIF.StartTalkPreview(ccPlugin, hMedia, hTalkRes);
 *      NPCCIF.StopTalkPreview(ccPlugin, hMedia, hTalkRes);
 * 12、退出平台
 *      NPCCIF.Close();
 * 13、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 定位功能模块的流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、添加、删除CC插件事件回调：参考NPCCInterlayer.js文件中NPCCILY.CCNotifyManager.Add()方法
 *      定位回调事件：NPCCEnum.CCObjectNotify.location_data_notify
 *      NPCCIF.AttachObjectEvent(ccPlugin, eventName, eventCallback);
 *      NPCCIF.DetachObjectEvent(ccPlugin, eventName, eventCallback);
 * 7、启动停止定位：第6步如果不执行，调用启动定位方法成功后是获取不到平台返回的定位数据的
 *      NPCCIF.StartLocationPreview(ccPlugin, hLocationRes);
 *      NPCCIF.StopLocationPreview(ccPlugin, hLocationRes);
 * 8、退出平台
 *      NPCCIF.Close();
 * 9、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 参数配置模块的流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、获取、设置视频清晰度
 *      NPCCIF.CAM_GetDefinition(ccPlugin, hCameraRes, streamType);
 *      NPCCIF.CAM_SetDefinition(ccPlugin, hCameraRes, definition, streamType);
 * 7、获取、设置音量
 *      NPCCIF.AUD_GetVolume(ccPlugin, hAudioRes);
 *      NPCCIF.AUD_SetVolume(ccPlugin, hAudioRes, volume);
 *      NPCCIF.TBK_SetInputVolume(ccPlugin, TBK_GetInputVolume);
 *      NPCCIF.TBK_SetInputVolume(ccPlugin, hTalkbackRes, volume);
 *      NPCCIF.TBK_GetOutputVolume(ccPlugin, hTalkbackRes);
 *      NPCCIF.TBK_SetOutputVolume(ccPlugin, hTalkbackRes, volume);
 * 8、退出平台
 *      NPCCIF.Close();
 * 9、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 云台控制模块流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、控制云台
 *      NPCCIF.PTZ_StartTurnLeft(ccPlugin, hPtzRes); // 向左转动
 *      NPCCIF.PTZ_StartTurnRight(ccPlugin, hPtzRes); // 向右转动
 *      NPCCIF.PTZ_StartTurnUp(ccPlugin, hPtzRes); // 向上转动
 *      NPCCIF.PTZ_StartTurnDown(ccPlugin, hPtzRes); // 向下转动
 *      NPCCIF.PTZ_StopTurn(ccPlugin, hPtzRes); // 停止转动
 * 7、退出平台
 *      NPCCIF.Close();
 * 8、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 添加子用户、给用户分配资源模块的流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、获取登录用户ID
 *      NPCCIF.GetUID(ccPlugin, hServer);
 * 7、获取当前登录用户下的所有子用户
 *      NPCCIF.GetUserList(ccPlugin, hServer);
 * 8、添加子用户
 *      NPCCIF.AddUser(ccPlugin, hServer, uiParentIndex, username, password, ucUserType, desc);
 * 9、修改子用户
 *      NPCCIF.ModifyUser(ccPlugin, hServer, uiIndex, username, password, desc);
 * 10、删除子用户
 *      NPCCIF.DeleteUser(ccPlugin, hServer, uiIndex);
 * 11、获取分配给当前登录用户资源
 *      NPCCIF.GetUserRes(ccPlugin, hServer, uiIndex);
 * 12、给子用户分配资源
 *      NPCCIF.AddUserRes(ccPlugin, hServer, uiIndex, resIDList);
 * 13、删除子用户分配的资源
 *      NPCCIF.RemoveUserRes(ccPlugin, hServer, uiIndex, resIDList);
 * 14、退出平台
 *      NPCCIF.Close();
 * 15、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * 语音通话模块流程
 * 1、初始化RST_WebSDK
 *      NPCCIF.Initialize();
 * 2、登录平台
 *      NPCCIF.Open();
 * 3、获取子域
 *      NPCCIF.ForkDomainList();
 * 4、获取设备
 *      NPCCIF.ForkPUList();
 * 5、获取子资源
 *      NPCCIF.ForkResList();
 * 6、发送呼叫用户语音通话的请求，响应会通过事件方式通知给上层
 *      NPCCIF.RSTW_EVT_CallUserTalkRequest(ccPlugin, hServer, strPUID, strCUID);
 * 7、接收到呼叫用户的响应，通过返回的值判断是否接听,开启对讲
 *      NPCCIF.StartTalkPreview(ccPlugin, hMedia, hTalkRes);
 * 8、停止对讲
 *      NPCCIF.StopTalkPreview(ccPlugin, hMedia, hTalkRes);
 * 9、退出平台
 *      NPCCIF.Close();
 * 10、释放RST_WebSDK资源
 *      NPCCIF.Terminate();
 */

/**
 * RST_WebSDK底层封装，直接调用插件的方法
 * @class NPCCIF
 * @autho shaosy
 * @version 3, 0, 187, 1719
 * @see RST_WebSDK含有两个插件的方法：CC插件和PW插件
 *          CC插件：处理与平台之间业务功能
 *          PW插件：处理视频播放窗口相关功能，目前RST_WebSDK只支持获取播放视频窗口句柄用于视频渲染，这个句柄是给CC插件用的，具体看CC插件的StartCameraPreview方法。
 */
var NPCCIF = {
    /** @property {string} 浏览器信息 */
    age: navigator.userAgent.toLocaleLowerCase(),

    /**
     *******************************************************************************************************************
     **************************************************CC插件方法********************************************************
     *******************************************************************************************************************
     */

    /**
     * 初始化RST_WebSDK，在调用NPCCIF其他方法之前调用
     * @param ccPlugin {Object} [in] cc插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示初始化失败
     * @see 一般在应用程序初始化时调用或在使用RST_WebSDK其他方法之前调用，该方法只要调用一次。
     *          不建议用户在使用RST_WebSDK方法期间多次调用该方法和NPCCIF.Terminate方法。
     */
    Initialize: function (ccPlugin) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_Initialize != 'undefined') {
                var operator = ccPlugin.RSTW_Initialize();
                operator = eval("(" + operator + ")");
                return new NPCCStruct.ReturnValueStruct(Number(operator.E));
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
            }
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 清空RST_WebSDK, 释放占用的资源，在NPCCIF所有的方法之后调用
     * @param ccPlugin {Object} [in] cc插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示清空失败
     * @see 一般在应用程序关闭时调用，清理并释放资源。不建议用户在没使用完RST_WebSDK方法期间多次调用该方法和NPCCIF.Initialize方法。
     */
    Terminate : function (ccPlugin) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_Terminate != 'undefined') {
                ccPlugin.RSTW_Terminate();
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
            }
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 登录平台，默认采用阻塞方式登录
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param loginParam {NPCCStruct.LoginParamStruct} [in] 登录参数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，此时value才有值，值表示的是服务句柄，下面接口会用到，否则表示登录失败
     * @see 一般在RST_WebSDK初始化后调用，与平台进行各种业务功能的前提；当前RST_WebSDK建议使用阻塞方式登录。
     */
    Open: function (ccPlugin, loginParam) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_Open != 'undefined') {
                if (!loginParam || !loginParam instanceof  NPCCStruct.LoginParamStruct) {
                    loginParam = new NPCCStruct.LoginParamStruct();
                }
                var operator = ccPlugin.RSTW_Open(loginParam.ip, loginParam.port, loginParam.username, loginParam.password,
                    loginParam.domain, '', 10, loginParam.block == 1 ? true : false, true,
                    NPCCEnum.ProxyType.ProxyType_NONE, '0.0.0.0', 0, '', '');
                operator = eval("(" + operator + ")") || {};
                return new NPCCStruct.ReturnValueStruct(Number(operator.E), operator.V);
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
            }
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 登录平台，默认采用非阻塞方式登录
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param szIP {Object} [in] IP地址
     * @param usPort {Object} [in] 端口
     * @param szUsername {Object} [in] 用户名
     * @param szPassword {Object} [in] 用户密码
     * @param szDomain {Object} [in] 域
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，
     */
    RSTW_LoginNoBlock: function (ccPlugin, szIP, usPort, szUsername, szPassword, szDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_LoginNoBlock", ccPlugin, szIP, usPort, szUsername, szPassword, szDomain);
    },

    /**
     * 获取登录状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，errorCode为0x0017表示登录正在进行，其他表示失败。
     * @see 如果采用非阻塞方式登录，需要不断调用该方法来判断是否登录成功，采用阻塞登录方式不需要调用该接口
     */
    GetConnectStatus: function (ccPlugin, hServer) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_GetConnectStatus != 'undefined')
            {
                if (hServer != "" && hServer != null && typeof hServer != "undefined")
                {
                    var operator =  ccPlugin.RSTW_GetConnectStatus(hServer);
                    operator = eval("(" + operator + ")") || {};
                    return new NPCCStruct.ReturnValueStruct(Number(operator.E));
                }
                else
                {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_C_E_INVALID_COMMAND);
                }
            }
            else
            {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_NC);
            }
        }
        catch (e)
        {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 获取登录服务器状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，errorCode为0x0017表示登录正在进行，其他表示失败。
     * @see 如果采用非阻塞方式登录，需要不断调用该方法来判断是否登录成功，采用阻塞登录方式不需要调用该接口
     */
    RSTW_GetLoginStatus: function (ccPlugin, hServer) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_GetLoginStatus != 'undefined')
            {
                if (hServer != "" && hServer != null && typeof hServer != "undefined")
                {
                    var operator =  ccPlugin.RSTW_GetLoginStatus(hServer);
                    operator = eval("(" + operator + ")") || {};
                    return new NPCCStruct.ReturnValueStruct(Number(operator.E));
                }
                else
                {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_C_E_INVALID_COMMAND);
                }
            }
            else
            {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_NC);
            }
        }
        catch (e)
        {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 退出平台
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     * @see 需要退出平台时调用，调用后就不能与平台进行各种业务功能，与NPCCIF.Open方法是互斥的。
     */
    Close: function (ccPlugin, hServer) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_Close != 'undefined') {
                if (hServer != "" && hServer != null && typeof hServer != "undefined") {
                    var operator =  ccPlugin.RSTW_Close(hServer);
                    operator = eval("(" + operator + ")") || {};
                    return new NPCCStruct.ReturnValueStruct(Number(operator.E));
                }
                else {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_C_E_INVALID_COMMAND);
                }
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
            }
        }
        catch (e) {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 退出平台
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     * @see 需要退出平台时调用，调用后就不能与平台进行各种业务功能，与NPCCIF.Open方法是互斥的。
     */
    RSTW_Logout: function (ccPlugin, hServer) {
        try {
            if (ccPlugin && typeof ccPlugin.RSTW_Logout != 'undefined') {
                if (hServer != "" && hServer != null && typeof hServer != "undefined") {
                    var operator =  ccPlugin.RSTW_Logout(hServer);
                    operator = eval("(" + operator + ")") || {};
                    return new NPCCStruct.ReturnValueStruct(Number(operator.E));
                }
                else {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_C_E_INVALID_COMMAND);
                }
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
            }
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 退出平台
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param szIP {Object} [in] IP地址
     * @param usPort {Object} [in] 端口
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     * @see 需要退出平台时调用，调用后就不能与平台进行各种业务功能，与NPCCIF.Open方法是互斥的。
     */
    RSTW_LogoutNoBlock: function (ccPlugin, hServer, szIP, usPort) {
        return NPCCIF.Common.GetCCResponse("RSTW_LogoutNoBlock", ccPlugin, hServer, szIP, usPort);
    },

    LimitSpeed: function(ccPlugin) {
        return NPCCIF.Common.GetPWResponse("RSTW_LimitSpeed", ccPlugin);
    },

    /**
     * 内部公共方法，上层不需要调用
     * @hideconstructor
     */
    Common:
    {
        /**
         * 判断插件（object）是否有方法（_method）
         * @param objectType {NPCCEnum.PluginType} [in] 插件类型，取值有NPCCEnum.PluginType.CC和NPCCEnum.PluginType.PW
         * @param object {Object} [in] 插件句柄
         * @param _method {string} [in] 对应插件方法名称
         * @returns {NPCCStruct.ReturnValueStruct} ReturnValueStruct.errorCode为0表示成功；其他表示失败。
         */
        CheckObjectMethod : function (objectType, object, _method)
        {
            try {
                var objectType = objectType || NPCCEnum.PluginType.CC;
                if (!object) {
                    switch (objectType) {
                        case NPCCEnum.PluginType.CC :
                            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_CC);
                            break;
                        case NPCCEnum.PluginType.PW :
                            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_LOADPLUG_PW);
                            break;
                    }
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_CC_E_PARAME);
                }

                if (typeof object[_method] == "undefined") {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_INTERFACE_UNDEFINED);
                }
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK);
            }
            catch (e) {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
            }
        },

        /**
         * 具体实现调用插件的方法并处理返回的结果
         * @private
         */
        _Response : function(_objType, _method, _obj)
        {
            try {
                var _minArgsCount = 3;
                switch(_objType)
                {
                    case NPCCEnum.PluginType.CC :
                        _minArgsCount = 3;
                        break;
                    case NPCCEnum.PluginType.PW :
                        _minArgsCount = 2;
                        break;
                }

                var _args = arguments, _argslen = _args.length;
                if (!_method || _argslen < (_minArgsCount + 1)) {
                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_ERROR);
                }
                else {
                    var _argsArr = new Array();
                    for (var i = 3; i < _argslen; i++) {
                        // if (typeof _args[i] == "object" && _args[i].constructor == Array) {
                        //     _argsArr.push(JSON.stringify(_args[i]));
                        // }
                        // else
                        // {
                            _argsArr.push(_args[i]);
                        // }
                    }

                    var chk_operator = NPCCIF.Common.CheckObjectMethod(_objType, _obj, _method);
                    if (chk_operator.errorCode != ErrorCode.NP_E_OK) {
                        return chk_operator;
                    }

                    // console.log(_obj[_method] + ' : ' + _argsArr);
                    var operator = _obj[_method].apply(_obj[_method], _argsArr);
                    if (!operator || typeof operator == "undefined") {
                        return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK);
                    }

                    switch(_objType) {
                        case NPCCEnum.PluginType.CC :
                            operator = eval("(" + operator + ")") || {};

                            if (_method == "RSTW_STOR_QueryStorageDate" || _method == "RSTW_STOR_QueryStorageDateForStream" || _method == "RSTW_STOR_QueryStorageFile"
                                || _method == "RSTW_STOR_QueryStorageDataForStream" || _method == "RSTW_OSS_GetStorageFileDate"
                                || _method == "RSTW_OSS_GetStorageDateFiles" || _method == "RSTW_DEV_GetBatteryParam"
                                || _method == "RSTW_OSS_GetLocationData" || _method == "RSTW_OSS_GetLocationDateData"
                                || _method == "RSTW_QueryLocalFile") {
                                if (operator.E == ErrorCode.NP_E_OK || operator.E == ErrorCode.NP_C_E_NEED_CONTINUE) {
                                    if (_method == "RSTW_STOR_QueryStorageDate" || _method == "RSTW_OSS_GetStorageFileDate" ||
                                        _method == "RSTW_STOR_QueryStorageDateForStream") {

                                    }
                                    else if (_method == "RSTW_STOR_QueryStorageDataForStream") {
                                        var fileInfoList = [];
                                        if (operator.E == ErrorCode.NP_E_OK) {
                                            fileInfoList = operator.V || [];
                                        }
                                        else {
                                            fileInfoList = operator.V.V || [];
                                        }

                                        var fileInfoListTemp = [];
                                        for (var i = 0; i < fileInfoList.length; i++) {
                                            var fileInfoStruct = new NPCCStruct.StorageFileInfoStruct();
                                            fileInfoStruct.strFileName = NPCCUtils.UTF8toUnicode(fileInfoList[i].Name);
                                            fileInfoStruct.strLetter = NPCCUtils.UTF8toUnicode(fileInfoList[i].DiskLetter);
                                            fileInfoStruct.strStartTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].BeginTime);
                                            fileInfoStruct.strEndTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].EndTime);
                                            fileInfoStruct.uiStartTimeUTC = fileInfoList[i].BeginTimeUTC;
                                            fileInfoStruct.uiEndTimeUTC = fileInfoList[i].EndTimeUTC;
                                            fileInfoStruct.uiFileSize = fileInfoList[i].Size;
                                            fileInfoStruct.strFilePath = NPCCUtils.UTF8toUnicode(fileInfoList[i].Path);

                                            for (var j = 0; j < fileInfoList[i].Reasons.length; j++) {
                                                fileInfoStruct.straReason[j] = NPCCUtils.UTF8toUnicode(fileInfoList[i].Reasons[j]);
                                            }

                                            // fileInfoStruct.straReason = fileInfoList[i].Reasons;
                                            fileInfoListTemp.push(fileInfoStruct);
                                        }

                                        if (operator.E == ErrorCode.NP_E_OK) {
                                            operator.V = fileInfoListTemp;
                                        }
                                        else {
                                            operator.V.V = fileInfoListTemp;
                                            operator.V.NewBeginTime = operator.V.NewBeginTime;
                                        }
                                    }
                                    else if (_method == "RSTW_DEV_GetBatteryParam") {
                                        var fileInfoStruct = new NPCCStruct.BatteryParamStruct();
                                        fileInfoStruct.Charging = operator.V.Charging;
                                        fileInfoStruct.Capacity = operator.V.Capacity;

                                        operator.V = fileInfoStruct;
                                    }
                                    else if (_method == "RSTW_STOR_QueryStorageFile" || _method == "RSTW_OSS_GetStorageDateFiles") {
                                        var fileInfoList = operator.V || [];
                                        var fileInfoListTemp = [];
                                        for (var i = 0; i < fileInfoList.length; i++) {
                                            var fileInfoStruct = new NPCCStruct.StorageFileInfoStruct();
                                            fileInfoStruct.strFileName = NPCCUtils.UTF8toUnicode(fileInfoList[i].Name);
                                            fileInfoStruct.strStartTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].BeginTime);
                                            fileInfoStruct.strEndTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].EndTime);
                                            fileInfoStruct.uiStartTimeUTC = NPCCUtils.UTF8toUnicode(fileInfoList[i].BeginTimeUTC);
                                            fileInfoStruct.uiEndTimeUTC = NPCCUtils.UTF8toUnicode(fileInfoList[i].EndTimeUTC);
                                            fileInfoStruct.uiFileSize = NPCCUtils.UTF8toUnicode(fileInfoList[i].Size);
                                            fileInfoStruct.strFilePath = NPCCUtils.UTF8toUnicode(fileInfoList[i].Path);
                                            for (var j = 0; j < fileInfoList[i].Reasons.length; j++) {
                                                fileInfoStruct.straReason[j] = NPCCUtils.UTF8toUnicode(fileInfoList[i].Reasons[j]);
                                            }
                                            // fileInfoStruct.straReason = fileInfoList[i].Reasons;
                                            fileInfoListTemp.push(fileInfoStruct);
                                        }

                                        operator.V = fileInfoListTemp;
                                    }
                                    else if (_method == "RSTW_OSS_GetLocationData" || _method == "RSTW_OSS_GetLocationDateData") {
                                        var fileInfoList = operator.V || [];
                                        var fileInfoListTemp = [];
                                        for (var i = 0; i < fileInfoList.length; i++) {
                                            var fileInfoStruct = new NPCCStruct.GetLocationDataStruct();
                                            fileInfoStruct.latitude = NPCCUtils.UTF8toUnicode(fileInfoList[i].Latitude);
                                            fileInfoStruct.longitude = NPCCUtils.UTF8toUnicode(fileInfoList[i].Longitude);
                                            fileInfoStruct.Bearing = NPCCUtils.UTF8toUnicode(fileInfoList[i].Bearing);
                                            fileInfoStruct.Speed = NPCCUtils.UTF8toUnicode(fileInfoList[i].Speed);
                                            fileInfoStruct.Altitude = NPCCUtils.UTF8toUnicode(fileInfoList[i].Altitude);
                                            fileInfoStruct.UTCTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].UTCTime);
                                            fileInfoStruct.LocationSystemType = NPCCUtils.UTF8toUnicode(fileInfoList[i].LocationSystemType);
                                            fileInfoStruct.State = NPCCUtils.UTF8toUnicode(fileInfoList[i].State);

                                            fileInfoListTemp.push(fileInfoStruct);
                                        }

                                        operator.V = fileInfoListTemp;
                                    }
                                    else if (_method == "RSTW_QueryLocalFile") {
                                        var fileInfoList = operator.V || [];
                                        var fileInfoListTemp = [];
                                        for (var i = 0; i < fileInfoList.length; i++) {
                                            var fileInfoStruct = new NPCCStruct.QueryLocalFileStruct();
                                            fileInfoStruct.FilePath = NPCCUtils.UTF8toUnicode(fileInfoList[i].FilePath);
                                            fileInfoStruct.FileName = NPCCUtils.UTF8toUnicode(fileInfoList[i].FileName);
                                            fileInfoStruct.FileSize = NPCCUtils.UTF8toUnicode(fileInfoList[i].FileSize);
                                            fileInfoStruct.StartTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].StartTime);
                                            fileInfoStruct.EndTime = NPCCUtils.UTF8toUnicode(fileInfoList[i].EndTime);

                                            fileInfoListTemp.push(fileInfoStruct);
                                        }

                                        operator.V = fileInfoListTemp;
                                    }

                                    return new NPCCStruct.ReturnValueStruct(Number(operator.E), operator.V);
                                }
                                else {
                                    return new NPCCStruct.ReturnValueStruct(Number(operator.E) || ErrorCode.NP_E_ERROR);
                                }
                            }
                            else if (_method == "RSTW_QueryEventLogEx") {
                                if (ErrorCode.CLIENT_SUCCEEDED(operator.E) || operator.E == ErrorCode.NP_C_E_NEED_CONTINUE) {
                                    if (!operator.V) {
                                        return new NPCCStruct.ReturnValueStruct(Number(operator.E));
                                    }

                                    for (var j = 0; j < operator.V.length; j++) {
                                        var EventSourceInfos = operator.V[j].EventSourceInfo || [];
                                        var EventSourceStruct = new NPCCStruct.QueryEventSourceInfoStruct();
                                        EventSourceStruct.DID = EventSourceInfos.DID;
                                        EventSourceStruct.RC = EventSourceInfos.RC;
                                        EventSourceStruct.RT = EventSourceInfos.RT;
                                        EventSourceStruct.SID = EventSourceInfos.SID;
                                        EventSourceStruct.SType = EventSourceInfos.SType;
                                        operator.V[j].EventSourceInfo = EventSourceStruct;

                                        var HistoryEventInfos = operator.V[j].HistoryEventInfos || [];
                                        var HistoryEventTemp = [];
                                        for (var i = 0; i < HistoryEventInfos.length; i++) {
                                            var HistoryEventStruct = new NPCCStruct.HistoryEventInfoArrayStruct();
                                            HistoryEventStruct.DID = HistoryEventInfos[i].DID;
                                            HistoryEventStruct.ID = HistoryEventInfos[i].ID;
                                            HistoryEventStruct.RC = HistoryEventInfos[i].RC;
                                            HistoryEventStruct.RT = HistoryEventInfos[i].RT;
                                            HistoryEventStruct.SID = HistoryEventInfos[i].SID;
                                            HistoryEventStruct.SType = HistoryEventInfos[i].SType;
                                            HistoryEventStruct.T = HistoryEventInfos[i].T;
                                            if (HistoryEventInfos[i].D) {
                                                HistoryEventStruct.D = HistoryEventInfos[i].D;
                                            }

                                            HistoryEventTemp.push(HistoryEventStruct);
                                        }

                                        operator.V[j].HistoryEventInfos = HistoryEventTemp;
                                    }

                                    return new NPCCStruct.ReturnValueStruct(Number(operator.E), operator.V);
                                }
                                else {
                                    return new NPCCStruct.ReturnValueStruct(Number(operator.E) || ErrorCode.NP_E_ERROR);
                                }
                            }
                            else {
                                if (ErrorCode.CLIENT_SUCCEEDED(operator.E)) {
                                    if (typeof operator.V == "string") {
                                        operator.V = NPCCUtils.UTF8toUnicode(operator.V);
                                    }
                                    else if (_method == "RSTW_GetUserList") {
                                        var userList = operator.V;
                                        var userListTemp = [];
                                        for (var i = 0; i<userList.length; i++) {
                                            var userStruct = new NPCCStruct.UserDetailInfoStruct();
                                            userStruct.id = userList[i].ID;
                                            userStruct.parentID = userList[i].ParentID;
                                            userStruct.name = NPCCUtils.UTF8toUnicode(userList[i].Name);
                                            userStruct.alias = NPCCUtils.UTF8toUnicode(userList[i].Alias);
                                            userStruct.desc = NPCCUtils.UTF8toUnicode(userList[i].Description);
                                            userStruct.deviceCount = userList[i].DeviceCount;
                                            userStruct.userType = userList[i].UserType;
                                            userListTemp.push(userStruct);
                                        }

                                        operator.V = userListTemp;
                                    }
                                    else if (_method == "RSTW_PTZ_GetPresetPositionList") {
                                        var positionList = operator.V || [];
                                        var positionListTemp = [];
                                        for (var i = 0; i<positionList.length; i++) {
                                            var positionStruct = new NPCCStruct.PresetPositionListStruct();
                                            positionStruct.index = positionList[i].index;
                                            positionStruct.descInfo = NPCCUtils.UTF8toUnicode(positionList[i].descInfo);
                                            positionListTemp.push(positionStruct);
                                        }

                                        operator.V = positionListTemp;
                                    }
                                    else if (_method == "RSTW_PTZ_GetAuxiliaryDeviceList") {
                                        var deviceList = operator.V || [];
                                        var deviceListTemp = [];
                                        for (var i = 0; i < deviceList.length; i++) {
                                            var deviceStruct = new NPCCStruct.AuxiliaryDeviceListStruct();
                                            deviceStruct.index = deviceList[i].index;
                                            deviceStruct.descInfo = NPCCUtils.UTF8toUnicode(deviceList[i].descInfo);
                                            deviceListTemp.push(deviceStruct);
                                        }

                                        operator.V = deviceListTemp;
                                    }
                                    else if (_method == "RSTW_STOR_GetDiskInfo") {
                                        var diskInfoList = operator.V || [];
                                        var diskInfoListTemp = [];
                                        for (var i = 0; i < diskInfoList.length; i++) {
                                            var diskInfoStruct = new NPCCStruct.DiskInfoStruct();
                                            diskInfoStruct.status = diskInfoList[i].Status;
                                            diskInfoStruct.strLetter = NPCCUtils.UTF8toUnicode(diskInfoList[i].Letter);
                                            diskInfoStruct.diskType = diskInfoList[i].Type;
                                            diskInfoStruct.uiCapacity = diskInfoList[i].Capacity;
                                            diskInfoStruct.uiUsedSpace = diskInfoList[i].Unused;
                                            diskInfoListTemp.push(diskInfoStruct);
                                        }
                                        operator.V = diskInfoListTemp;
                                    }
                                    else if (_method == "RSTW_RSTW_GetDownloadProgress") {
                                        var loadFileInfoList = operator.V;
                                        var loadFileInfoListTemp = [];
                                        // for (var i = 0; i < loadFileInfoList.length; i++) {
                                            var loadFileInfoStruct = new NPCCStruct.loadFileInfoStruct();
                                            loadFileInfoStruct.Progress = loadFileInfoList.Progress;
                                            loadFileInfoStruct.Total = loadFileInfoList.Total;
                                            loadFileInfoStruct.Transfer = loadFileInfoList.Transfer;
                                            loadFileInfoStruct.TransferSizeStream = loadFileInfoList.TransferSizeStream;
                                            loadFileInfoListTemp.push(loadFileInfoStruct);
                                        // }
                                        operator.V = loadFileInfoListTemp;
                                    }
                                    return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK, operator.V);
                                }
                                else {
                                    return new NPCCStruct.ReturnValueStruct(Number(operator.E) || ErrorCode.NP_E_ERROR);
                                }
                            }

                            break;
                        case NPCCEnum.PluginType.PW :
                            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK, operator);
                            break;
                    }
                }
            }
            catch(e) {
                var msg = e.message;
                var name= e.name;
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
            }
        },

        /**
         * 调用CC插件的方法并处理返回的结果
         * @param _method {string} [in] cc插件方法名称
         * @param cc  {Object} [in] cc插件句柄
         * @param handle {Object} [in] 句柄对象，可以为hServer（服务句柄）或hRes（资源句柄）等
         */
        GetCCResponse : function(_method, cc, handle) {
            var argsArr = [NPCCEnum.PluginType.CC];
            for (var i = 0; i < arguments.length; i++) {
                argsArr.push(arguments[i]);
            }

            return NPCCIF.Common._Response.apply(this, argsArr);
        },

        /**
         * 调用PW插件的方法并处理返回的结果
         * @param _method {string} [in] pw方法名称
         * @param pw {Object} [in] pw插件句柄
         */
        GetPWResponse : function(_method, pw)
        {
            var argsArr = [NPCCEnum.PluginType.PW];
            for (var i = 0; i < arguments.length; i++)
            {
                argsArr.push(arguments[i]);
            }
            return NPCCIF.Common._Response.apply(this, argsArr);
        },

        end : true
    },

    /**
     * 从服务器获取所有域、所有设备和资源，该接口是在阻塞登陆服务器的时候，需要调用
     * 该接口代替了ForkDomainList()、ForkPUList()、ForkResList()
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功,否则表示获取失败
     */
    RSTW_ForkResoure: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkResoure", ccPlugin, hServer);
    },

    /**
     * 获取所有子域
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有子域句柄，否则表示获取失败
     * @see 1、当errorCode为0时，如果value有值，说明获取到子域了，否则就是表示没有子域。
     *          2、value返回的是子域句柄，如果想获取域详细信息，需要调用下面的NPCCIF.DOMAIN_GetID、NPCCIF.DOMAIN_GetDID、NPCCIF.DOMAIN_GetName、
     *             NPCCIF.DOMAIN_GetParentID和NPCCIF.DOMAIN_GetDesc方法。
     *          3、平台默认有一个根域，域名称可以通过NPCCIF.COMMON_GetName方法获取。
     */
    ForkDomainList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkDomainList", ccPlugin, hServer);
    },

    /**
     * 获取平台所有子域
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有子域句柄，否则表示获取失败
     * @see 1、当errorCode为0时，如果value有值，说明获取到子域了，否则就是表示没有子域。
     *          2、value返回的是子域句柄，如果想获取域详细信息，需要调用下面的NPCCIF.DOMAIN_GetID、NPCCIF.DOMAIN_GetDID、NPCCIF.DOMAIN_GetName、
     *             NPCCIF.DOMAIN_GetParentID和NPCCIF.DOMAIN_GetDesc方法。
     *          3、平台默认有一个根域，域名称可以通过NPCCIF.COMMON_GetName方法获取。
     */
    RSTW_GetDomainList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetDomainList", ccPlugin, hServer);
    },

    /**
     * 获取所有设备
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有设备句柄，否则表示获取失败
     * @see 获取的是已分配给当前登录用户的所有设备，同NPCCIF.ForkDomainList方法类似，value返回的是设备句柄，如果想要获取设备详细信息，
     *          还需要调用NPCCIF.COMMON_GetName、NPCCIF.COMMON_GetDesc、NPCCIF.COMMON_IsEnable等方法。
     */
    ForkPUList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkPUList", ccPlugin, hServer);
    },

    /**
     * 获取所有设备句柄
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有设备句柄，否则表示获取失败
     * @see 获取的是已分配给当前登录用户的所有设备，同NPCCIF.ForkDomainList方法类似，value返回的是设备句柄，如果想要获取设备详细信息，
     *          还需要调用NPCCIF.COMMON_GetName、NPCCIF.COMMON_GetDesc、NPCCIF.COMMON_IsEnable等方法。
     */
    RSTW_GetPUList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetPUList", ccPlugin, hServer);
    },

    /**
     * 获取所有设备下的子资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示获取失败
     * @see 该方法调用成功后不返回子资源句柄，但是子资源的值已经缓存在底层了，如果需要可以通过调用NPCCIF.COMMON_GetChildren方法来获取子资源。
     */
    ForkResList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkResList", ccPlugin, hServer);
    },

    /**
     * 获取一个设备句柄
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param did {string} [in] 域id
     * @param puid {string} [in] 设备的puid
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备句柄，否则表示获取失败
     */
    ForkOnePU: function (ccPlugin, hServer, did , puid) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkOnePU", ccPlugin, hServer, did, puid);
    },

    /**
     * 获取一个设备句柄
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param did {string} [in] 域id
     * @param puid {string} [in] 设备的puid
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备句柄，否则表示获取失败
     */
    RSTW_GetOnePU: function (ccPlugin, hServer, did , puid) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetOnePU", ccPlugin, hServer, did, puid);
    },

    /**
     * 获取组织列表
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有设备句柄，否则表示获取失败
     */
    ForkOrgList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_ForkOrgList", ccPlugin, hServer);
    },

    /**
     * 获取组织列表
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是所有设备句柄，否则表示获取失败
     */
    GetOrgList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetOrgList", ccPlugin, hServer);
    },

    /**
     * 获取平台下的所有存储资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hserver {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     */
    GetStorageUnitResList: function(ccPlugin, hserver) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetStorageUnitResList", ccPlugin, hserver);
    },

    /**
     * 用户管理
     */

    /**
     * 获取当前登录用户ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是用户ID，否则表示获取失败
     */
    GetUID: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetUID", ccPlugin, hServer);
    },

    /**
     * 获取当前用户下的所有子用户信息
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是子用户数组，否则表示获取失败
     * @see value返回的是所有子用户信息，是个数组，数据类型为NPCCStruct.UserDetailInfoStruct结构体
     */
    GetUserList: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetUserList", ccPlugin, hServer);
    },

    /**
     * 添加新的用户
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiParentIndex {int} [in] 父用户ID
     * @param username {string} [in] 用户名
     * @param password {string} [in] 用户登录密码
     * @param ucUserType {int} [in] 用户类型，可以取值NPCCEnum.UserType.UserType_Normal和NPCCEnum.UserType.UserType_Group
     * @param desc {string} [in] 用户描述
     * @param uiFeatures {int} [in] 表示特色功能集合,有一个或多个特色功能组成，若添加的用户是普通用户，则传值0
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的新加的用户ID，否则表示添加失败
     * @see 该方法添加的用户一律为当前登录用户的子用户，当前登录用户可以为这个子用户分配设备
     */
    AddUser: function(ccPlugin, hServer, uiParentIndex, username, password, ucUserType, desc, uiFeatures) {
        return NPCCIF.Common.GetCCResponse("RSTW_AddUser", ccPlugin, hServer, uiParentIndex, username, password,
            ucUserType, desc, uiFeatures);
    },

    /**
     * 修改用户
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiIndex {int} [in] 用户ID
     * @param username {string} [in] 用户名
     * @param password {string} [in] 用户登录密码
     * @param desc {string} [in] 用户描述
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示修改失败
     * @see 该方法可以修改用户的名称、登录密码和描述；建议自己不要修改自己，自己只修改密码即可，密码修改之后下次生效。
     */
    ModifyUser: function (ccPlugin, hServer, uiIndex, username, password, desc) {
        return NPCCIF.Common.GetCCResponse("RSTW_ModifyUser", ccPlugin, hServer, uiIndex, username, password, desc);
    },

    /**
     * 删除用户
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiIndex {int} [in] 用户ID
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示删除失败
     * @see 建议只删除子用户，自己不要删除自己，自己由父用户来删除
     */
    DeleteUser: function (ccPlugin, hServer, uiIndex) {
        return NPCCIF.Common.GetCCResponse("RSTW_DeleteUser", ccPlugin, hServer, uiIndex);
    },

    /**
     * 获取用户资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiIndex {int} [in] 用户ID
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源ID数组（包括设备ID和子资源ID），否则表示获取失败
     * @see 1、一般都是获取子用户分配的资源，当前用户分配的资源是在登录平台成功后调用NPCCIF.ForkPUList方法和NPCCIF.ForkResList方法就已经获取回来了
     *      2、子用户资源是由父用户分配的，所以子用户分配的资源，父用户都是有的。
     *      3、value返回的是资源ID数组，通过资源ID，我们可以从当前用户分配的资源中找到对应资源。
     */
    GetUserRes: function (ccPlugin, hServer, uiIndex) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetUserRes", ccPlugin, hServer, uiIndex);
    },

    /**
     * 添加用户资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiIndex {int} [in] 用户ID
     * @param resIDList {Array} [in] 设备资源ID数组，添加设备会自动添加设备下的子资源，注意是设备资源ID非子资源ID
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示添加失败
     */
    AddUserRes: function (ccPlugin, hServer, uiIndex, resIDList) {
        return NPCCIF.Common.GetCCResponse("RSTW_AddUserRes", ccPlugin, hServer, uiIndex, resIDList);
    },

    /**
     * 删除用户资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiIndex {int} [in] 用户ID
     * @param resIDList {Array} [in] 设备资源ID数组，删除设备会自动删除设备下的子资源，注意是设备资源ID非子资源ID
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示删除失败
     */
    RemoveUserRes: function (ccPlugin, hServer, uiIndex, resIDList) {
        return NPCCIF.Common.GetCCResponse("RSTW_RemoveUserRes", ccPlugin, hServer, uiIndex, resIDList);
    },

    /**
     * 查询历史报警事件
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param uiBeginTime {string} [in] 起始时间
     * @param uiEndTime {string} [in] 结束时间
     * @param eventIDList {Array} [in] 事件列表
     * @param sourceInfoList {Array} [in] 资源信息列表
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {*} (NPCCStruct.ReturnValueStruct) errorCode为0表示成功，value返回的是获取的事件内容，否则表示获取失败
     */
    QueryEventLogEx: function(ccPlugin, hServer, uiBeginTime, uiEndTime, eventIDList, sourceInfoList, uiOffset, uiCount) {
        return NPCCIF.Common.GetCCResponse("RSTW_QueryEventLogEx", ccPlugin, hServer, uiBeginTime, uiEndTime, eventIDList, sourceInfoList, uiOffset, uiCount);
    },

    /**
     * 是否是登录平台
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，其他表示失败。
     * @see 调用该接口可以知道当前登录对象是平台还是设备，errorCode为0时，如果value为1表示的是登录平台，否则为直连设备。
     */
    IsPlatform: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsPlatform", ccPlugin, hServer);
    },

    /**
     * 获取域的唯一号，数据库生成的
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDomain {Object} [in] 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域的id，否则表示获取失败
     */
    DOMAIN_GetID: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetID", ccPlugin, hDomain);
    },

    /**
     * 获取域ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDomain {Object} [in] 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域ID，否则表示获取失败
     */
    DOMAIN_GetDID: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetDID", ccPlugin, hDomain);
    },

    /**
     * 获取域名称
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDomain {Object} [in] 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域名称，否则表示获取失败
     */
    DOMAIN_GetName: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetName", ccPlugin, hDomain);
    },

    /**
     * 获取父域的唯一号
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDomain {Object} [in] 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是父域的id，否则表示获取失败
     */
    DOMAIN_GetParentID: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetParentID", ccPlugin, hDomain);
    },

    /**
     * 获取域描述
     * @param ccPlugin {Object} cc插件句柄
     * @param hDomain {Object} 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域描述，否则表示获取失败
     */
    DOMAIN_GetDesc: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetDesc", ccPlugin, hDomain);
    },

    /**
     * 获取该域所有设备
     * @param ccPlugin {Object} cc插件句柄
     * @param hDomain {Object} 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域描述，否则表示获取失败
     */
    DOMAIN_GetPUList: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetPUList", ccPlugin, hDomain);
    },

    /**
     * 获取该域所有子域
     * @param ccPlugin {Object} cc插件句柄
     * @param hDomain {Object} 域句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是域描述，否则表示获取失败
     */
    DOMAIN_GetSubDomainList: function (ccPlugin, hDomain) {
        return NPCCIF.Common.GetCCResponse("RSTW_DOMAIN_GetSubDomainList", ccPlugin, hDomain);
    },

    /**
     * 获取当前组织下的子节点（不包括子节点的子节点）
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示获取失败
     */
    ORG_ForkNodeList: function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_ForkNodeList", ccPlugin, hOrganization);
    },

    /**
     * 获取当前组织下的子节点（不包括子节点的子节点）
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示获取失败
     */
    ORG_GetNodeList: function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_GetNodeList", ccPlugin, hOrganization);
    },

    /**
     * 获取指定组织的所有资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是子资源句柄数组，否则表示获取失败
     */
    ORG_ForkElement : function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_ForkElement", ccPlugin, hOrganization);
    },

    /**
     * 获取指定组织的所有资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是子资源句柄数组，否则表示获取失败
     */
    ORG_GetElement : function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_GetElement", ccPlugin, hOrganization);
    },

    /**
     * 获取组织的节点ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备唯一ID，否则表示获取失败
     */
    ORG_GetNodeID: function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_GetNodeID", ccPlugin, hOrganization);
    },

    /**
     * 获取组织名称
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源名称，否则表示获取失败
     */
    ORG_GetName: function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_GetName", ccPlugin, hOrganization);
    },

    /**
     * 获取组织描述
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrganization {Object} [in] 组织句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源描述，否则表示获取失败
     */
    ORG_GetDesc: function (ccPlugin, hOrganization) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORG_GetDesc", ccPlugin, hOrganization);
    },

    /**
     * 获取组织节点下的资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrgNode {Object} [in] 组织节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源描述，否则表示获取失败
     */
    ORGNODE_GetResources: function (ccPlugin, hOrgNode) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORGNODE_GetResources", ccPlugin, hOrgNode);
    },

    /**
     * 当前节点的子节点信息
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrgNode {Object} [in] 组织节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源描述，否则表示获取失败
     */
    ORGNODE_GetSubNodes: function (ccPlugin, hOrgNode) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORGNODE_GetSubNodes", ccPlugin, hOrgNode);
    },

    /**
     * 获取组织节点ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrgNode {Object} [in] 组织节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备唯一ID，否则表示获取失败
     */
    ORGNODE_GetOrgID: function (ccPlugin, hOrgNode) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORGNODE_GetOrgID", ccPlugin, hOrgNode);
    },

    /**
     * 获取节点名称
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrgNode {Object} [in] 组织节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源名称，否则表示获取失败
     */
    ORGNODE_GetName: function (ccPlugin, hOrgNode) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORGNODE_GetName", ccPlugin, hOrgNode);
    },

    /**
     * 获取节点描述
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hOrgNode {Object} [in] 组织节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源描述，否则表示获取失败
     */
    ORGNODE_GetDesc: function (ccPlugin, hOrgNode) {
        return NPCCIF.Common.GetCCResponse("RSTW_ORGNODE_GetDesc", ccPlugin, hOrgNode);
    },

    /**
     * 获取指定资源的子资源
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄，一般这里是设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是子资源句柄数组，否则表示获取失败
     * @see 返回的是子资源句柄，如果想要获取资源详细信息，还需要调用NPCCIF.COMMON_GetName、NPCCIF.COMMON_GetDesc、NPCCIF.COMMON_IsEnable等方法。
     */
    COMMON_GetChildren : function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetChildren", ccPlugin, hRes);
    },

    /**
     * 获取资源信息
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源信息，否则表示获取失败
     */
    COMMON_GetResourceInfo: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetResourceInfo", ccPlugin, hRes);
    },

    /**
     * 获取资源节点类型
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源名称，否则表示获取失败
     */
    COMMON_GetNodeType: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetNodeType", ccPlugin, hRes);
    },

    /**
     * 获取当前ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hBaseRes {Object} [in] 当前节点的句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备唯一ID，否则表示获取失败
     */
    COMMON_GetID: function (ccPlugin, hBaseRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetID", ccPlugin, hBaseRes);
    },

    /**
     * 获取父资源句柄
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源名称，否则表示获取失败
     */
    COMMON_GetParent: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetParent", ccPlugin, hRes);
    },

    /**
     * 获取资源名称
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源名称，否则表示获取失败
     */
    COMMON_GetName: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetName", ccPlugin, hRes);
    },

    /**
     * 获取资源描述
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源描述，否则表示获取失败
     */
    COMMON_GetDesc: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetDesc", ccPlugin, hRes);
    },

    /**
     * 资源是否可用
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源是否可用，1代表可用，0代表不可用，否则表示获取失败
     */
    COMMON_IsEnable: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_IsEnable", ccPlugin, hRes);
    },

    /**
     * 获取资源PUID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源puid，否则表示获取失败
     */
    COMMON_GetPUID: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetPUID", ccPlugin, hRes);
    },

    /**
     * 获取资源ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct}  errorCode为0表示成功，value返回的是资源id，否则表示获取失败
     */
    COMMON_GetResID: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetResID", ccPlugin, hRes);
    },

    /**
     * 获取资源类型
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源类型，否则表示获取失败
     */
    COMMON_GetResType: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetResType", ccPlugin, hRes);
    },

    /**
     * 获取资源索引
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源索引，否则表示获取失败
     */
    COMMON_GetResIdx: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetResIdx", ccPlugin, hRes);
    },

    /**
     * 资源是否在线
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源是否在线，1代表在线，0代表不在线，否则表示获取失败
     */
    COMMON_IsOnline: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_IsOnline", ccPlugin, hRes);
    },

    /**
     * 资源所在的域ID
     * @param ccPlugin {Object} [in] 插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源所在域ID，否则表示获取失败
     */
    COMMON_GetDID: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetDID", ccPlugin, hRes);
    },

    /**
     * 资源型号类型
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源型号类型，否则表示获取失败
     */
    COMMON_GetModelType: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetModelType", ccPlugin, hRes);
    },

    /**
     * 获取资源所在的纬度
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源默认位置：纬度，否则表示获取失败
     */
    COMMON_GetLongitude: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetLongitude", ccPlugin, hRes);
    },

    /**
     * 获取资源所在的经度
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hRes {Object} [in] 资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是资源默认位置：经度，否则表示获取失败
     */
    COMMON_GetLatitude: function (ccPlugin, hRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_COMMON_GetLatitude", ccPlugin, hRes);
    },

    /**
     * 获取设备型号
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPuRes {Object} [in] 设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备型号，否则表示获取失败
     */
    DEV_GetModel: function (ccPlugin, hPuRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_DEV_GetModel", ccPlugin, hPuRes);
    },

    /**
     * 获取设备的软件版本号
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPuRes {Object} [in] 设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是软件版本号，否则表示获取失败
     */
    DEV_GetSoftwareVersion: function (ccPlugin, hPuRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_DEV_GetSoftwareVersion", ccPlugin, hPuRes);
    },

    /**
     * 获取设备的硬件版本号
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPuRes {Object} [in] 设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是硬件版本号，否则表示获取失败
     */
    DEV_GetHardwareVersion: function (ccPlugin, hPuRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_DEV_GetHardwareVersion", ccPlugin, hPuRes);
    },

    /**
     * 获取设备的唯一ID
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPuRes {Object} [in] 设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是设备唯一ID，否则表示获取失败
     */
    DEV_GetDeviceSN: function (ccPlugin, hPuRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_DEV_GetDeviceSN", ccPlugin, hPuRes);
    },

    /**
     * 电量查询
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param devHandle {Object} [in] 设备句柄
     * @returns {NPCCStruct.ReturnValueStruct} charging为0表示不在充电，1表示正在充电；Capacity为电量多少
     */
    DEV_GetBatteryParam: function (ccPlugin, devHandle) {
        return NPCCIF.Common.GetCCResponse("RSTW_DEV_GetBatteryParam", ccPlugin, devHandle);
    },

    /**
     * 获取视频清晰度
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hCameraRes {Object} [in] 摄像头资源句柄
     * @param streamType {NPCCEnum.StreamType} 流类型，取值NPCCEnum.StreamType.ST_MainStream或NPCCEnum.StreamType.ST_SubStream
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是视频清晰度，否则表示获取失败
     */
    CAM_GetDefinition: function (ccPlugin, hCameraRes, streamType) {
        return NPCCIF.Common.GetCCResponse("RSTW_CAM_GetDefinition", ccPlugin, hCameraRes, streamType);
    },

    /**
     * 设置视频清晰度
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hCameraRes {Object} [in] 摄像头资源句柄
     * @param definition {int} 清晰度（范围0-100）
     * @param streamType {NPCCEnum.StreamType} 流类型，取值NPCCEnum.StreamType.ST_MainStream或NPCCEnum.StreamType.ST_SubStream
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示设置失败
     */
    CAM_SetDefinition: function (ccPlugin, hCameraRes, definition, streamType) {
        return NPCCIF.Common.GetCCResponse("RSTW_CAM_SetDefinition", ccPlugin, hCameraRes, definition, streamType);
    },

    /**
     * 获取音频音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hAudioRes {Object} [in] 音频资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是音频音量，否则表示获取失败
     */
    AUD_GetVolume: function (ccPlugin, hAudioRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_AUD_GetVolume", ccPlugin, hAudioRes);
    },

    /**
     * 设置音频音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hAudioRes {Object} [in] 音频资源句柄
     * @param volume {int} 音量（范围0-100）
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示设置失败
     */
    AUD_SetVolume: function (ccPlugin, hAudioRes, volume) {
        return NPCCIF.Common.GetCCResponse("RSTW_AUD_SetVolume", ccPlugin, hAudioRes, volume);
    },

    /**
     * 获取对讲资源输入音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hTalkbackRes {Object} [in] 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是输入音量，否则表示获取失败
     */
    TBK_GetInputVolume: function (ccPlugin, hTalkbackRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_TBK_GetInputVolume", ccPlugin, hTalkbackRes);
    },

    /**
     * 设置对讲资源输入音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hTalkbackRes {Object} [in] 对讲资源句柄
     * @param volume {int} 音量（范围0-100）
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示设置失败
     */
    TBK_SetInputVolume: function (ccPlugin, hTalkbackRes, volume) {
        return NPCCIF.Common.GetCCResponse("RSTW_TBK_SetInputVolume", ccPlugin, hTalkbackRes, volume);
    },

    /**
     * 获取对讲资源输出音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hTalkbackRes {Object} [in] 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value返回的是输出音量，否则表示获取失败
     */
    TBK_GetOutputVolume: function (ccPlugin, hTalkbackRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_TBK_GetOutputVolume", ccPlugin, hTalkbackRes);
    },

    /**
     * 设置对讲资源输出音量
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hTalkbackRes {Object} [in] 对讲资源句柄
     * @param volume {int} 音量（范围0-100）
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示设置失败
     */
    TBK_SetOutputVolume: function (ccPlugin, hTalkbackRes, volume) {
        return NPCCIF.Common.GetCCResponse("RSTW_TBK_SetOutputVolume", ccPlugin, hTalkbackRes, volume);
    },

    /**
     * 启动定位
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hLocationRes {Object} [in] 定位资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     * @see 该方法启动成功后，定位数据是通过回调的方式传给上层的，所以要想获得定位数据,开发者还需要调用NPCCIF.AttachObjectEvent绑定NPCCEnum.CCObjectNotify.location_data_notify事件。
     */
    StartLocationPreview: function (ccPlugin, hLocationRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_LOC_StartStream", ccPlugin, hLocationRes);
    },

    /**
     * 停止定位
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hLocationRes {Object} [in] 定位资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    StopLocationPreview: function (ccPlugin, hLocationRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_LOC_StopStream", ccPlugin, hLocationRes);
    },

    /**
     * 获取存储文件系统类型
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_GetFileSystemType: function (ccPlugin, hStorageRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_GetFileSystemType", ccPlugin, hStorageRes);
    },

    /**
     * 获取磁盘信息
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_GetDiskInfo: function (ccPlugin, hStorageRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_GetDiskInfo", ccPlugin, hStorageRes);
    },

    /**
     * DiskSystemType_FAT32 文件存储系统：获取前端存储文件的日期
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param ucIVIndex {int} [in] 摄像头
     * @param nStreamType  {int} [in] 流类型
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount  {int} [in]  每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_QueryStorageDate: function (ccPlugin, hStorageRes, ucIVIndex, nStreamType, uiOffset, uiCount) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_QueryStorageDate", ccPlugin, hStorageRes, ucIVIndex, nStreamType, uiOffset, uiCount);
    },

    /**
     * DiskSystemType_Stream 流式存储系统：获取前端存储文件的日期
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param ucIVIndex {int} [in] 摄像头
     * @param strDiskLetter {string} [in] 盘符
     * @param nStreamType  {int} [in] 流类型
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_QueryStorageDateForStream: function (ccPlugin, hStorageRes, ucIVIndex, strDiskLetter, nStreamType) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_QueryStorageDateForStream", ccPlugin, hStorageRes, ucIVIndex, strDiskLetter, nStreamType);
    },

    /**
     * DiskSystemType_FAT32 文件存储系统：获取前端存储文件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param ucIVIndex {int} [in] 摄像头
     * @param  reasonList {string} [in] 原因
     * @param nStreamType  {int} [in] 流类型
     * @param strStartTime {string} [in] 起始时间
     * @param strEndTime {string} [in] 结束时间
     * @param uiOffset {int} [in]  起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_QueryStorageFile: function (ccPlugin, hStorageRes, ucIVIndex, reasonList, strStartTime, strEndTime, nStreamType, uiOffset, uiCount) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_QueryStorageFile", ccPlugin, hStorageRes, ucIVIndex, reasonList, strStartTime, strEndTime, nStreamType, uiOffset, uiCount);
    },

    /**
     * DiskSystemType_Stream 流式存储系统：获取前端存储文件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param ucIVIndex {int} [in] 摄像头
     * @param strDiskLetter {string} [in] 盘符
     * @param  reasonList {string} [in] 原因
     * @param strStartTime {string} [in] 起始时间
     * @param strEndTime {string} [in] 结束时间
     * @param nStreamType {int} [in] 流类型
     * @param nDuration=15 {int} [in] 存储时间
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    STOR_QueryStorageDataForStream: function (ccPlugin, hStorageRes, ucIVIndex, strDiskLetter, reasonList, strStartTime, strEndTime, nStreamType, nDuration) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_QueryStorageDataForStream", ccPlugin, hStorageRes, ucIVIndex,
            strDiskLetter, reasonList, strStartTime, strEndTime, nStreamType, nDuration);
    },

    /**
     * 删除前端指定的存储文件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param straFile {Object} [in]  要删除的文件路径
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     */
    STOR_DeleteStorageFile: function(ccPlugin, hStorageRes, straFile) {
        return NPCCIF.Common.GetCCResponse("RSTW_STOR_DeleteStorageFile", ccPlugin, hStorageRes, straFile);
    },

    /**
     * 云台控制，获取预置位列表
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_GetPresetPositionList: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_GetPresetPositionList", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，获取辅助设备列表
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_GetAuxiliaryDeviceList: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_GetAuxiliaryDeviceList", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，开始向左转
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 该方法调用完后，需要调用NPCCIF.PTZ_StopTurn方法来停止转动，否则云台会一直向左转
     */
    PTZ_StartTurnLeft: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StartTurnLeft", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，开始向右转
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 需要调用NPCCIF.PTZ_StopTurn方法来停止转动，否则云台会一直向右转
     */
    PTZ_StartTurnRight: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StartTurnRight", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，开始向上转
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see NPCCIF.PTZ_StopTurn方法来停止转动，否则云台会一直向上转
     */
    PTZ_StartTurnUp: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StartTurnUp", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，开始向下转
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see NPCCIF.PTZ_StopTurn方法来停止转动，否则云台会一直向下转
     */
    PTZ_StartTurnDown: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StartTurnDown", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，停止转动
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StopTurn: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StopTurn", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，增大光圈
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_AugmentAperture: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_AugmentAperture", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，减小光圈
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_MinishAperture: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_MinishAperture", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，停止缩放光圈
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StopApertureZoom: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StopApertureZoom", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，推远焦点
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_MakeFocusFar: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_MakeFocusFar", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，拉近焦点
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_MakeFocusNear: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_MakeFocusNear", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，停止调整焦点
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StopFocusMove: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StopFocusMove", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，缩小图像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_ZoomOutPicture: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_ZoomOutPicture", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，放大图像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_ZoomInPicture: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_ZoomInPicture", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，停止缩放图像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StopPictureZoom: function (ccPlugin, hPtzRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StopPictureZoom", ccPlugin, hPtzRes);
    },

    /**
     * 云台控制，前往预置位
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @param uiPresetPos {int} [in] 预置位置
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_MoveToPresetPos: function (ccPlugin, hPtzRes, uiPresetPos) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_MoveToPresetPos", ccPlugin, hPtzRes, uiPresetPos);
    },

    /**
     * 云台控制，开启辅助设备
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @param usSecondaryDev {int} [in] 辅助设备
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StartSecondaryDev: function (ccPlugin, hPtzRes, usSecondaryDev) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StartSecondaryDev", ccPlugin, hPtzRes, usSecondaryDev);
    },

    /**
     * 云台控制，关闭辅助设备
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hPtzRes {Object} [in] 云台资源句柄
     * @param usSecondaryDev {int} [in] 辅助设备
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    PTZ_StopSecondaryDev: function (ccPlugin, hPtzRes, usSecondaryDev) {
        return NPCCIF.Common.GetCCResponse("RSTW_PTZ_StopSecondaryDev", ccPlugin, hPtzRes, usSecondaryDev);
    },

    /**
     * 手动开启平台录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param devHandle {string} [in] 设备句柄
     * @param ucResIdx  {int} [in] 资源通道号
     * @param bRecordAudio{Bool} [in] 是否录制音频
     * @param uiStreamType {int} [in] 流类型
     * @param usDuration {int} [in] 录制时间, 取值1-1440，单位分钟
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    RSTW_OSS_ManualStartStorage: function (ccPlugin, devHandle, ucResIdx, bRecordAudio, uiStreamType, usDuration) {
        return NPCCIF.Common.GetCCResponse("RSTW_OSS_ManualStartStorage", ccPlugin, devHandle, ucResIdx,
            bRecordAudio, uiStreamType, usDuration);
    },

    /**
     * 手动停止平台录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param devHandle {string} [in] 设备句柄
     * @param ucResIdx  {int} [in] 资源通道号
     * @param bRecordAudio{Bool} [in] 是否录制音频
     * @param uiStreamType {int} [in] 流类型
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    RSTW_OSS_ManualStopStorage: function (ccPlugin, devHandle, ucResIdx, bRecordAudio, uiStreamType) {
        return NPCCIF.Common.GetCCResponse("RSTW_OSS_ManualStopStorage", ccPlugin, devHandle, ucResIdx,
            bRecordAudio, uiStreamType);
    },

    /**
     * 查询平台存储文件的日期
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param uiDID {int} [in] 当前资源的DID
     * @param strPUID {string} [in] 当前资源的PUID
     * @param ucResType  {int} [in] 当前资源的类型
     * @param ucResIdx  {int} [in] 当前资源的下标
     * @param st{int} [in] 流类型
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    OSS_GetStorageFileDate: function (ccPlugin, hStorageRes, uiDID, strPUID, ucResType, ucResIdx, st, uiOffset, uiCount) {
        return NPCCIF.Common.GetCCResponse("RSTW_OSS_GetStorageFileDate", ccPlugin, hStorageRes, uiDID, strPUID, ucResType, ucResIdx, st, uiOffset, uiCount);
    },

    /**
     * 查询平台指定日期的存储文件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param uiDID {int} [in] 当前资源的DID
     * @param strPUID {string} [in] 当前资源的PUID
     * @param ucResType  {int} [in] 当前资源的类型
     * @param ucResIdx  {int} [in] 当前资源的下标
     * @param strDate {string} [in] 日期
     * @param st{int} [in] 流类型
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    OSS_GetStorageDateFiles: function (ccPlugin, hStorageRes, uiDID, strPUID, ucResType, ucResIdx, strDate, st, uiOffset, uiCount) {
        return NPCCIF.Common.GetCCResponse("RSTW_OSS_GetStorageDateFiles", ccPlugin, hStorageRes, uiDID, strPUID, ucResType, ucResIdx, strDate, st, uiOffset, uiCount);
    },

    /**
     * 删除平台下的指定的存储文件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageRes {Object} [in] 存储资源句柄
     * @param straFile {Object} [in]  要删除的文件路径
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功；其他表示失败。
     */
    OSS_DeleteStorageFiles: function(ccPlugin, hStorageRes, straFile) {
        return NPCCIF.Common.GetCCResponse("RSTW_OSS_DeleteStorageFiles", ccPlugin, hStorageRes, straFile);
    },

    /**
     * 查询定位信息（模糊查询）
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageUnitRes {string} [in] 存储资源句柄
     * @param uiDID {int} [in] 域的DID
     * @param strPUID {string} [in] 设备PUID
     * @param ucResType {string} [in] 设备类型
     * @param ucResIdx {string} [in] 设备索引
     * @param strStartTime {string} [in] 起始时间
     * @param strEndTime {string} [in] 结束时间
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    OSS_GetLocationData: function(ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, strStartTime, strEndTime, uiOffset, uiCount) {
        return  NPCCIF.Common.GetCCResponse("RSTW_OSS_GetLocationData", ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, strStartTime, strEndTime, uiOffset, uiCount);
    },

    /**
     * 查询定位信息的日期
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageUnitRes {string} [in] 存储资源句柄
     * @param uiDID {int} [in] 域的DID
     * @param strPUID {string} [in] 设备PUID
     * @param ucResType {string} [in] 设备类型
     * @param ucResIdx {string} [in] 设备索引
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    OSS_GetLocationDataDate: function(ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, uiOffset, uiCount) {
        return  NPCCIF.Common.GetCCResponse("RSTW_OSS_GetLocationDataDate", ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, uiOffset, uiCount);
    },

    /**
     * 查询指定日期的定位信息
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorageUnitRes {string} [in] 存储资源句柄
     * @param uiDID {int} [in] 域的DID
     * @param strPUID {string} [in] 设备PUID
     * @param ucResType {string} [in] 设备类型
     * @param ucResIdx {string} [in] 设备索引
     * @param strDate {string} [in] 查询日期
     * @param uiOffset {int} [in] 起始位置
     * @param uiCount {int} [in] 每次查询个数
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    OSS_GetLocationDateData: function(ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, strDate, uiOffset, uiCount) {
        return  NPCCIF.Common.GetCCResponse("RSTW_OSS_GetLocationDateData", ccPlugin, hStorageUnitRes, uiDID, strPUID, ucResType, ucResIdx, strDate, uiOffset, uiCount);
    },

    // ----------------------------------------------------------------------------------------------------------------
    // 音视频相关
    // ----------------------------------------------------------------------------------------------------------------

    /**
     * 启动视频预览
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hCameraRes {Object} [in] 摄像头资源句柄
     * @param hWnd {Object} [in] 窗口句柄，即调用NPCCIF.GetWindowHandle方法返回的值
     * @param bSupportedPlayback {Bool} [in] 是否支持回放
     * @param streamType {NPCCEnum.StreamType} [in]  流类型，取值NPCCEnum.StreamType.ST_MainStream或NPCCEnum.StreamType.ST_SubStream
     * @param alg {NPCCEnum.StreamVideoAlg} [in] 视频算法，取值参照NPCCEnum.StreamVideoAlg.SVA_H264或NPCCEnum.StreamVideoAlg.SVA_MPEG4，只有streamType为转码流时有效，目前不支持
     * @param width {int} [in] 视频宽度，只有streamType为转码流时有效
     * @param height {int} [in] 视频高度，只有streamType为转码流时有效
     * @param frameRate {int} [in] 帧率，只有streamType为转码流时有效
     * @param bitRate {int} [in] 码率，只有streamType为转码流时有效
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value为媒体库句柄，否则表示启动失败
     * @see 该方法可以启动一路视频预览，可以调用多次打开多个摄像头同时预览
     */
    StartCameraPreview: function (ccPlugin, hCameraRes, hWnd, bSupportedPlayback, streamType, alg, width, height, frameRate, bitRate) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartCameraPreview", ccPlugin, hCameraRes, hWnd,
            (typeof bSupportedPlayback != 'undefined' ? bSupportedPlayback : false), false,
            (typeof streamType != 'undefined' ? streamType : 1), (typeof alg != 'undefined' ? alg : 1),
            (typeof width != 'undefined' ? width : 0), (typeof height != 'undefined' ? height : 0),
            (typeof frameRate != 'undefined' ? frameRate : 0), (typeof bitRate != 'undefined' ? bitRate : 0), 0, false, 0, 3000);
    },

    /**
     * 启动音频
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hAudioRes {Object} [in] 音频资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    StartAudioPreview: function (ccPlugin, hMedia, hAudioRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartAudioPreview", ccPlugin, hMedia, hAudioRes);
    },

    /**
     * 是否支持实时回放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    RSTW_IsSupportedRealtimePlayback: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsSupportedRealtimePlayback", ccPlugin, hMedia);
    },

    /**
     * 获取当前音视频帧的utc时间，如果有视频，只返回视频帧的utc时间，如果只有音频，就返回音频的utc时间
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value为时间戳，单位毫秒,否则表示获取失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    RSTW_GetRealtimeTime: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetRealtimeTime", ccPlugin, hMedia);
    },

    /**
     * 获取正在预览的音视频的utc时间，如果有视频，只返回视频帧的utc时间，如果只有音频，就返回音频的utc时间
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value为时间戳，单位毫秒,否则表示获取失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    RSTW_GetRealPlaybackTime: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetRealPlaybackTime", ccPlugin, hMedia);
    },

    /**
     * 获取当前音视频帧的时间戳，如果有视频，只返回视频帧的时间戳，如果只有音频，就返回音频的时间戳
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value为时间戳，单位毫秒,否则表示获取失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    RSTW_GetRealtimeTimestamp: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetRealtimeTimestamp", ccPlugin, hMedia);
    },

    /**
     * 获取正在预览的音视频的时间戳，如果有视频，只返回视频帧的时间戳，如果只有音频，就返回音频的时间戳
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，value为时间戳，单位毫秒,否则表示获取失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频
     */
    RSTW_GetRealPlaybackTimestamp: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetRealPlaybackTimestamp", ccPlugin, hMedia);
    },

    /**
     * 实时预览过程中，跳到之前位置回放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param uiTimestamp {Object} [in] 从这个时间戳上开始回放，这个时间不大于RSTW_GetRealtimeTimestamp返回的时间戳
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示跳转失败
     */
    RSTW_JumpPreview: function (ccPlugin, hMedia, uiTimestamp) {
        return NPCCIF.Common.GetCCResponse("RSTW_JumpPreview", ccPlugin, hMedia, uiTimestamp);
    },

    /**
     * 停止音视频预览
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param type {NPCCEnum.StopRealtimePreviewType} [in] 停止流类型，取值NPCCEnum.StopRealtimePreviewType.SREP_VIDEO、NPCCEnum.StopRealtimePreviewType.SREP_AUDIO、NPCCEnum.StopRealtimePreviewType.SREP_ALL
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     * @see 当type取值为NPCCEnum.StopRealtimePreviewType.SREP_VIDEO代表只停止视频，此时建议把音频也停止了；
     *          当type取值为NPCCEnum.StopRealtimePreviewType.SREP_AUDIO代表只停止音频；
     *          当type取值为NPCCEnum.StopRealtimePreviewType.SREP_ALL代表同时停止音视频
     */
    StopPreview: function (ccPlugin, hMedia, type) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopPreview", ccPlugin, hMedia, type);
    },

    /**
     * 启动对讲
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hTalkRes {Object} 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频；对讲和喊话不能共存，打开对讲前需要先停止喊话
     */
    StartTalkPreview: function (ccPlugin, hMedia, hTalkRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartTalkPreview", ccPlugin, hMedia, hTalkRes);
    },

    /**
     * 停止对讲
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hTalkRes {Object} [in] 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    StopTalkPreview: function (ccPlugin, hMedia, hTalkRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopTalkPreview", ccPlugin, hMedia, hTalkRes);
    },

    /**
     * 启动喊话
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hTalkRes {Object} [in] 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     * @see 调用该方法前，必选先调用NPCCIF.StartCameraPreview方法打开视频；喊话和对讲不能共存，打开喊话前需要先停止对讲
     */
    StartCallPreview: function (ccPlugin, hMedia, hTalkRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartCallPreview", ccPlugin, hMedia, hTalkRes);
    },

    /**
     * 停止喊话
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hTalkRes {Object} [in] 对讲资源句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    StopCallPreview: function (ccPlugin, hMedia, hTalkRes) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopCallPreview", ccPlugin, hMedia, hTalkRes);
    },

    /**
     * 打开点播远程录像或者回放本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hWnd {Object} [in] 视频播放窗口
     * @param strSource {string} [in] 录像文件路径
     * @param hStorager {string} [in] 为NULL表示本地录像回放，为存储器资源时表示前端点播，为存储单元资源时表示平台点播
     * @param ucResIdx {int} [in] hStorager为NULL时直接传默认值-1，hStorager不为NULL时表示摄像头资源的索引
     * @param pszDiskLetter {string} [in] 盘符，hStorager不为NULL时有效
     * @returns {*} E： 错误码  V:媒体库句柄
     * @constructor
     */
    OpenReplayPreview : function(ccPlugin, hWnd, strSource, hStorager, ucResIdx, pszDiskLetter) {
        return NPCCIF.Common.GetCCResponse("RSTW_OpenReplayPreview", ccPlugin, hWnd, strSource,
            (hStorager == null ?  '' : hStorager), ucResIdx, (pszDiskLetter == null ?  '' : pszDiskLetter));
    },

    /**
     * 设置是否带视频播放，默认为带视频播放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param bHasVideo {Boolean} [in] 为true表示带视频播放，否则表示视频不播放，只播放音频
     * @returns {*}
     * @constructor
     */
    SetPlayHasVideo : function(ccPlugin, hMedia, bHasVideo) {
        return NPCCIF.Common.GetCCResponse("RSTW_SetPlayHasVideo", ccPlugin, hMedia, bHasVideo);
    },

    /**
     * 设置预览状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param nVideoPreviewPreviewStatus {int} [in] 视频是否预览，0表示不预览，1表示预览，-1表示未知
     * @param nInputAudioPreviewStatus {int} [in] 输入音频是否预览，0表示不预览，1表示预览，-1表示未知
     * @param nOutputAudioPreviewStatus {int} [in] 输出音频是否预览，0表示不预览，1表示预览，-1表示未知
     * @returns {*}
     * @constructor
     */
    SetMedia: function(ccPlugin, hMedia, nVideoPreviewPreviewStatus, nInputAudioPreviewStatus, nOutputAudioPreviewStatus) {
        return NPCCIF.Common.GetCCResponse("RSTW_SetMedia", ccPlugin, hMedia, nVideoPreviewPreviewStatus, nInputAudioPreviewStatus, nOutputAudioPreviewStatus);
    },

    /**
     * 设置点播或回放参数
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param mReplayMode {int} [in] 回放模式，0表示正常模式播放，默认为0；1表示按关键帧模式播放
     * @param nReplayDirection {int} [in] 回放方向，0表示向前播放；1表示向后播放
     * @param nReplaySpeed {int} [in] 回放速度，慢进：可以取值：-2，-1， 0  依次表示慢进1/4、慢进1/2，正常播放
     快进：可以取值：0，1，2，3，4，依次表示正常播放、快进2、快进4、快进8、快进16
     * @returns {*}
     * @constructor
     */
    Replay: function(ccPlugin, hMedia, mReplayMode, nReplayDirection, nReplaySpeed) {
        return NPCCIF.Common.GetCCResponse("RSTW_Replay", ccPlugin, hMedia, mReplayMode, nReplayDirection, nReplaySpeed);
    },

    /**
     * 开始点播或者回放本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param nOffset {int} [in] 播放起始位置
     * @returns {*}
     * @constructor
     */
    StartReplayPreview: function(ccPlugin, hMedia, nOffset) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartReplayPreview", ccPlugin, hMedia, nOffset);
    },

    /**
     * 暂停点播或者回放本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*}
     * @constructor
     */
    PauseReplayPreview : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_PauseReplayPreview", ccPlugin, hMedia);
    },

    /**
     * 跳到指定位置继续播放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param nOffset {int} [in] 新的播放起始位置
     * @returns {*}
     * @constructor
     */
    JumpReplayPreview : function(ccPlugin, hMedia, nOffset) {
        return NPCCIF.Common.GetCCResponse("RSTW_JumpReplayPreview", ccPlugin, hMedia, nOffset);
    },

    /**
     * 停止点播或者回放本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*}
     * @constructor
     */
    StopReplayPreview : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopReplayPreview", ccPlugin, hMedia);
    },

    /**
     * 关闭点播或者回放本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*}
     * @constructor
     */
    CloseReplayPreview : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_CloseReplayPreview", ccPlugin, hMedia);
    },

    /**
     * 视频的点播或回放状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*} E：错误码 V：状态，0表示停止；1表示播放、2表示暂停
     * @constructor
     */
    GetVideoRenderStatus : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetVideoRenderStatus", ccPlugin, hMedia);
    },

    /**
     * 输入音频的点播或回放状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*} E：错误码 V：状态，0表示停止；1表示播放、2表示暂停
     * @constructor
     */
    GetInputAudioRenderStatus : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetInputAudioRenderStatus", ccPlugin, hMedia);
    },

    /**
     * 输出音频的点播或回放状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*} E：错误码 V：状态，0表示停止；1表示播放、2表示暂停
     * @constructor
     */
    GetOutputAudioRenderStatus : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetOutputAudioRenderStatus", ccPlugin, hMedia);
    },

    /**
     * 获取点播总时间，即点播或回放当前录像文件需要的总时间
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*} 	E：错误码 V：录像文件总时间
     * @constructor
     */
    GetVodTotalTime : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetVodTotalTime", ccPlugin, hMedia);
    },

    /**
     * 获取当前点播的时间，即点播或回放当前录像文件的当前时间
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*} E：错误码 V：当前点播的时间
     * @constructor
     */
    GetVodCurTime : function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetVodCurTime", ccPlugin, hMedia);
    },

    /**
     * 设置播放窗口
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param hWnd {Object} [in] 窗口句柄，即调用NPCCIF.GetWindowHandle方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     */
    SetRenderWnd: function (ccPlugin, hMedia, hWnd) {
        return NPCCIF.Common.GetCCResponse("RSTW_SetRenderWnd", ccPlugin, hMedia, hWnd);
    },

    /**
     * 设置视频播放窗口区域
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param nLeft {int} [in] 距离窗口左边位置
     * @param nTop {int} [in] 距离窗口顶部位置
     * @param nRight {int} [in] 距离窗口右边位置
     * @param nBottom {int} [in] 距离窗口底部位置
     * @returns {*}
     * @constructor
     */
    SetRenderRect : function(ccPlugin, hMedia, nLeft, nTop, nRight, nBottom) {
        return NPCCIF.Common.GetCCResponse("RSTW_SetRenderRect", ccPlugin, hMedia, nLeft, nTop, nRight, nBottom);
    },

    /**
     * 设置视频播放窗口预览模式
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} 媒体库句柄
     * @param nhWhdWidth{int} 窗口宽度
     * @param nhWhdHeight {int} 窗口高度
     * @param nMode {int} 预览模式， 1表示铺满视频窗口； 2表示按图像原始比例显示
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    SetDisplayMode : function(ccPlugin, hMedia, nhWhdWidth, nhWhdHeight, nMode) {
        return NPCCIF.Common.GetPWResponse("RSTW_SetDisplayMode", ccPlugin, hMedia, nhWhdWidth, nhWhdHeight, nMode);
    },

    /**
     * 设置视频播放窗口预览模式
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} 媒体库句柄
     * @param nhWhdWidth{int} 窗口宽度
     * @param nhWhdHeight {int} 窗口高度
     * @param nMode {int} 预览模式， 1表示铺满视频窗口； 2表示按图像原始比例显示
     * @param nVideoWidth{int} 窗口分辨率宽度
     * @param nVideoHeight {int} 窗口分辨率高度
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    SetDisplayModeEx : function(ccPlugin, hMedia, nhWhdWidth, nhWhdHeight, nMode, nVideoWidth, nVideoHeight) {
        return NPCCIF.Common.GetPWResponse("RSTW_SetDisplayModeEx", ccPlugin, hMedia, nhWhdWidth, nhWhdHeight, nMode, nVideoWidth, nVideoHeight);
    },

    /**
     * 刷新最后一帧画面
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示启动失败
     */
    RefreshImage: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_RefreshImage", ccPlugin, hMedia);
    },

    /**
     * 视频是否正在播放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns E： 错误码	V：0表示不是；1表示是
     */
    IsVideoPreviewOpen: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsVideoPreviewOpen", ccPlugin, hMedia);
    },

    /**
     * 输入音频是否正在播放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns E： 错误码	V：0表示不是；1表示是
     */
    IsInputAudioPreviewOpen: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsInputAudioPreviewOpen", ccPlugin, hMedia);
    },

    /**
     * 输出视频是否正在播放
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns E： 错误码	V：0表示不是；1表示是
     */
    IsOutputAudioPreviewOpen: function (ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsOutputAudioPreviewOpen", ccPlugin, hMedia);
    },

    /**
     * 本地抓拍
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @param filePath {string} [in] 抓拍文件保存路径（如C://12345.bmp）
     * @returns {*}
     * @constructor
     */
    Snapshot : function(ccPlugin, hMedia, filePath) {
        return NPCCIF.Common.GetCCResponse("RSTW_SnapPicture", ccPlugin, hMedia, filePath);
    },

    /**
     * 旋转图像
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {*}
     * @constructor
     */
    RSTW_Rotate90: function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_Rotate90", ccPlugin, hMedia);
    },

    /**
     * 启动本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @param filePath {string} [in] 录像文件保存路径（如C://12345.rav）
     * @param uiMaxRecordTimeInterval {int} [in] 录像时间
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    StartRecord: function(ccPlugin, hMedia, filePath, uiMaxRecordTimeInterval) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartRecord", ccPlugin, hMedia, filePath, uiMaxRecordTimeInterval);
    },

    /**
     * 判断录像是否打开
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄，调用NPCCIF.StartCameraPreview方法返回的值
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    IsRecordOpen: function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_IsRecordOpen", ccPlugin, hMedia);
    },

    /**
     * 停止本地录像
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hMedia {Object} [in] 媒体库句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    StopRecord: function(ccPlugin, hMedia) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopRecord", ccPlugin, hMedia);
    },

    /**
     * 启动下载
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hStorager {Object} [in] 是存储资源时表示从前端下载；是存储器句柄时表示从平台下载；为NULL时表示本地下载
     * @param strDownloadFileInfo {string} [in] json数据，下载文件信息
     * @param uiMaxRecordTimeInterval {Int} [in] 下载文件最大时间
     * @returns E： 错误码 V：下载句柄
     */
    StartDownload: function (ccPlugin, hStorager, strDownloadFileInfo, uiMaxRecordTimeInterval) {
        return NPCCIF.Common.GetCCResponse("RSTW_StartDownload", ccPlugin, hStorager, strDownloadFileInfo, uiMaxRecordTimeInterval);
    },

    /**
     * 获取下载进度
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDownload {Object} [in] 下载句柄
     * @returns E：错误码 V：JSON格式数据，Progress：下载进度 Total：总大小 Transfer：发送大小 TransferSizeStream：发送大小（流式）
     */
    GetDownloadProgress: function (ccPlugin, hDownload) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetDownloadProgress", ccPlugin, hDownload);
    },

    /**
     * 获取下载状态
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDownload {Object} [in] 下载句柄
     * @returns E：错误码 V：下载状态，0表示未知；1表示正在下载；2表示下载完成；3表示正在合成；4表示合成完成
     */
    GetDownloadStatus: function (ccPlugin, hDownload) {
        return NPCCIF.Common.GetCCResponse("RSTW_GetDownloadStatus", ccPlugin, hDownload);
    },

    /**
     * 停止下载
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hDownload {Object} [in] 下载句柄
     * @param nStopType {Int} [in] 停止下载类型，0表示停止下载；1表示暂停下载；2表示删除下载任务
     * @returns E：错误码 V：JSON格式数据，Progress：下载进度 Total：总大小 Transfer：发送大小 TransferSizeStream：发送大小（流式）
     */
    StopDownload: function (ccPlugin, hDownload, nStopType) {
        return NPCCIF.Common.GetCCResponse("RSTW_StopDownload", ccPlugin, hDownload, nStopType);
    },

    /**
     * 本地查询和录像查询
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strDir {Object} [in] 目录名称
     * @param strFilter {Object} [in] 通配符
     * @returns {*}
     * @constructor
     */
    RSTW_QueryLocalFile : function(ccPlugin, strDir, strFilter) {
        return NPCCIF.Common.GetCCResponse("RSTW_QueryLocalFile", ccPlugin, strDir, strFilter);
    },

    /**
     * 指定文件是否存在
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strFile {Object} [in] 文件名称
     * @returns {*}
     * @constructor
     */
    Util_IsFileExist : function(ccPlugin, strFile) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_IsFileExist", ccPlugin, strFile);
    },

    /**
     * 指定目录是否存在
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strDir {Object} [in] 目录名称
     * @returns {*}
     * @constructor
     */
    Util_IsDirExist : function(ccPlugin, strDir) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_IsDirExist", ccPlugin, strDir);
    },

    /**
     * 创建一个目录，递归创建各级目录
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strDir {Object} [in] 目录名称
     * @returns {*}
     * @constructor
     */
    Util_CreateDir : function(ccPlugin, strDir) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_CreateDir", ccPlugin, strDir);
    },

    /**
     * 删除本地文件
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param straFile {Object} [in] 路径
     * @returns {*}
     * @constructor
     */
    Util_DeleteFiles : function(ccPlugin, straFile) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_DeleteFiles", ccPlugin, straFile);
    },

    /**
     * 从全路径名中取出路径信息
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strPath {Object} [in] 路径
     * @returns {*}
     * @constructor
     */
    Util_PathNameToPath : function(ccPlugin, strPath) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_PathNameToPath", ccPlugin, strPath);
    },

    /**
     * 从全路径名中取出文件名信息
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strPath {Object} [in] 路径
     * @returns {*}
     * @constructor
     */
    Util_PathNameToName : function(ccPlugin, strPath) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_PathNameToName", ccPlugin, strPath);
    },

    /**
     * 获得文件的大小
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strFilePath {Object} [in] 文件路径
     * @returns {*}
     * @constructor
     */
    Util_GetFileSize : function(ccPlugin, strFilePath) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_GetFileSize", ccPlugin, strFilePath);
    },

    /**
     * 获得一个目录下的文件列表
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strDir {Object} [in] 目录名称
     * @param strFilter {Object} [in] 通配符
     * @returns {*}
     * @constructor
     */
    Util_GetFiles : function(ccPlugin, strDir, strFilter) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_GetFiles", ccPlugin, strDir, strFilter);
    },

    /**
     * 获得一个目录下的子目录列表
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strDir {Object} [in] 目录名称
     * @returns {*}
     * @constructor
     */
    Util_GetSubDirs : function(ccPlugin, strDir) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_GetSubDirs", ccPlugin, strDir);
    },

    /**
     * 查看图片
     * @param ccPlugin  Object} [in] cc插件句柄
     * @param strFilePath {Object} [in] 文件路径
     * @returns {*}
     * @constructor
     */
    RSTW_Util_ExecuteFile: function(ccPlugin, strFilePath){
        return NPCCIF.Common.GetCCResponse("RSTW_Util_ExecuteFile", ccPlugin, strFilePath);
    },

    /**
     * 修改文件名
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param strOldPath {Object} [in] 旧的文件路径
     * @param strNewPath {Object} [in] 新的文件路径
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示停止失败
     */
    ReFileName: function(ccPlugin, strOldPath, strNewPath) {
        return NPCCIF.Common.GetCCResponse("RSTW_Util_ReFileName", ccPlugin, strOldPath, strNewPath);
    },

    /**
     * 绑定事件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param eventMethodName {string} [in] 事件方法名，必须跟插件里定义的一致，请看NPCCEnum.CCObjectNotify
     * @param callback {function} [in] 回调函数，参数必须跟插件定义的一致，请看NPCCInterlayer.js文中NPCCILY.CCNotifyManager，这里详细给出回调方法参数定义
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    AttachObjectEvent: function (ccPlugin, eventMethodName, callback)
    {
        try {
            if (ccPlugin && eventMethodName) {
                if(typeof callback != "function") {
                    callback = function() {};
                }
                var is_ie_11 = (NPCCIF.age.search("msie") == -1 && NPCCIF.age.search("trident") != -1 ? true : false);
                if (ccPlugin.attachEvent && typeof ccPlugin.attachEvent == "function") {
                    ccPlugin.attachEvent("on" + eventMethodName, callback);
                }
                else if (ccPlugin.addEventListener && typeof ccPlugin.addEventListener == "function") {
                    if (is_ie_11) {
                        ccPlugin["on" + eventMethodName] = callback;
                    }
                    else {
                        ccPlugin.addEventListener(eventMethodName, callback, false);
                    }
                }
                else {
                    ccPlugin["on" + eventMethodName] = callback;
                }
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_ERROR);
            }
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK);
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    /**
     * 移除事件
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param eventMethodName {string} [in] 事件方法名，必须跟插件里定义的一致，同AttachObjectEvent方法
     * @param callback {function} [in] 回调函数，参数必须跟插件定义的一致，同AttachObjectEvent方法
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     */
    DetachObjectEvent: function (ccPlugin, eventMethodName, callback)
    {
        try {
            if (ccPlugin && eventMethodName) {
                if(typeof callback != "function") {
                    callback = function() {};
                }

                var is_ie_11 = (NPCCIF.agt.search("msie") == -1 && NPCCIF.agt.search("trident") != -1 ? true : false);
                if (ccPlugin.detachEvent && typeof ccPlugin.detachEvent == "function") {
                    ccPlugin.detachEvent("on" + eventMethodName, callback);
                }
                else if (ccPlugin.removeEventListener && typeof ccPlugin.removeEventListener == "function") {
                    if (is_ie_11) {
                        if (typeof ccPlugin["on" + eventMethodName] != "undefined") {
                            ccPlugin["on" + eventMethodName] = "";
                            delete ccPlugin["on" + eventMethodName];
                        }
                    }
                    else {
                        ccPlugin.removeEventListener(eventMethodName, callback, false);
                    }
                }
                else {
                    if (typeof ccPlugin["on" + eventMethodName] != "undefined") {
                        ccPlugin["on" + eventMethodName] = "";
                        delete ccPlugin["on" + eventMethodName];
                    }
                }
            }
            else {
                return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_ERROR);
            }
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_OK);
        }
        catch (e) {
            return new NPCCStruct.ReturnValueStruct(ErrorCode.NP_E_THREAD);
        }
    },

    // ----------------------------------------------------------------------------------------------------------------
    // 即时会话相关
    // ----------------------------------------------------------------------------------------------------------------

    /**
     * 登录即时会话服务
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示登录失败
     */
    RSTW_Chat_Login: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_Chat_Login", ccPlugin, hServer);
    },

    /**
     * 即时会话服务是否登录
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功
     */
    RSTW_Chat_IsLogin: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_Chat_IsLogin", ccPlugin, hServer);
    },

    /**
     * 退出即时会话服务
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功
     */
    RSTW_Chat_Logout: function (ccPlugin, hServer) {
        return NPCCIF.Common.GetCCResponse("RSTW_Chat_Logout", ccPlugin, hServer);
    },

    /**
     * 发送短消息，非阻塞接口，发送通知告知上层是否发送成功
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param strMsg {String} [in] 消息内容
     * @param strUserName {String} [in] 用户名，也就是发送对象
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功
     */
    RSTW_Chat_SendShortMsg: function (ccPlugin, hServer, strMsg, strUserName) {
        return NPCCIF.Common.GetCCResponse("RSTW_Chat_SendShortMsg", ccPlugin, hServer, strMsg, strUserName);
    },

    /**
     * 呼叫用户语音通话的请求，响应会通过事件方式通知给上层
     * @param ccPlugin {Object} [in] cc插件句柄
     * @param hServer {Object} [in] 服务句柄
     * @param strPUID {String} [in] 呼叫用户绑定设备的PUID
     * @param strCUID {String} [in] 呼叫用户的CUID，如果没有填空字符串
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功
     */
    RSTW_EVT_CallUserTalkRequest: function (ccPlugin, hServer, strPUID, strCUID) {
        return NPCCIF.Common.GetCCResponse("RSTW_EVT_CallUserTalkRequest", ccPlugin, hServer, strPUID, strCUID);
    },

    /**
     *******************************************************************************************************************
     **************************************************PW插件方法********************************************************
     *******************************************************************************************************************
     */

    /**
     * 获取窗口句柄
     * @param pw {Object} pw插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，errorCode为0表示成功，否则表示执行失败
     */
    GetWindowHandle : function(pw) {
        return NPCCIF.Common.GetPWResponse("RSTW_GetWindow", pw);
    },

    /**
     * 全屏
     * @param pw {Object} pw插件
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    FullScreen : function(pw) {
        return NPCCIF.Common.GetPWResponse("RSTW_FullScreen", pw);
    },

    /**
     * 退出全屏
     * @param pw {Object} pw插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    ExitFullScreen : function(pw) {
        return NPCCIF.Common.GetPWResponse("RSTW_ExitFullScreen", pw);
    },

    /**
     * 设置是否重绘背景标志
     * @param pw {Object} pw插件句柄
     * @param value {int} 0为不重绘，1为重绘，当视频开始播放时应设为0，否则设为1
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    SetEraseBkgndFlag : function(pw, value) {
        return NPCCIF.Common.GetPWResponse("RSTW_SetEraseBkgndFlag", pw, value);
    },

    /**
     * 设置控制模式
     * @param pw {Object} pw插件句柄
     * @param mode {int} 0表示拖拽，1表示框选，框选模式时不会全屏
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    SetControlMode : function(pw, mode) {
        return NPCCIF.Common.GetPWResponse("RSTW_SetControlMode", pw, mode);
    },

    /**
     * 添加右键菜单项
     * @param pw {Object} pw插件句柄
     * @param nFlag {int} 表示菜单类型，0为字符串，0x800为横线
     * @param nItemID {string} 表示该菜单项ID
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    AppendMenuItem : function(pw, nFlag, nItemID) {
        return NPCCIF.Common.GetPWResponse("RSTW_AppendMenuItem", pw, nFlag, nItemID);
    },

    /**
     * 添加右键菜单项
     * @param pw {Object} pw插件句柄
     * @param nFlag {int} 表示菜单类型，0为字符串，0x800为横线
     * @param nItemID {string} 表示该菜单项ID
     * @param szText {string} 表示该菜单文本
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    AppendMenuItem2 : function(pw, nFlag, nItemID, szText) {
        return NPCCIF.Common.GetPWResponse("RSTW_AppendMenuItem2", pw, nFlag, nItemID, szText);
    },

    /**
     * 移除所有的右键菜单项
     * @param pw {Object} pw插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，否则表示执行失败
     * @see 暂未使用，正在测试
     */
    DeleteAllMenuItem : function(pw) {
        return NPCCIF.Common.GetPWResponse("RSTW_DeleteAllMenuItem", pw);
    },

    /**
     * 重绘窗口
     * @param pw {Object} pw插件句柄
     * @returns {NPCCStruct.ReturnValueStruct} errorCode为0表示成功，errorCode为0表示成功，否则表示执行失败
     */
    RedrawWindow: function(pw) {
        return NPCCIF.Common.GetPWResponse("RSTW_RedrawWindow", pw);
    },
};